summaryrefslogtreecommitdiff
path: root/includes/tests
diff options
context:
space:
mode:
Diffstat (limited to 'includes/tests')
-rw-r--r--includes/tests/bootstrap.test83
-rw-r--r--includes/tests/common.test54
-rw-r--r--includes/tests/registry.test152
-rw-r--r--includes/tests/xmlrpc.test126
4 files changed, 415 insertions, 0 deletions
diff --git a/includes/tests/bootstrap.test b/includes/tests/bootstrap.test
new file mode 100644
index 000000000..beb94edf0
--- /dev/null
+++ b/includes/tests/bootstrap.test
@@ -0,0 +1,83 @@
+<?php
+
+class BootstrapIPAddressTestCase extends DrupalWebTestCase {
+
+ /**
+ * Implementation of getInfo().
+ */
+ function getInfo() {
+ return array(
+ 'name' => t('IP address test'),
+ 'description' => t('Get the IP address from the current visitor from the server variables.'),
+ 'group' => t('Bootstrap')
+ );
+ }
+
+ /**
+ * Implementation of setUp().
+ */
+ function setUp() {
+ $this->oldserver = $_SERVER;
+
+ $this->remote_ip = '127.0.0.1';
+ $this->proxy_ip = '127.0.0.2';
+ $this->forwarded_ip = '127.0.0.3';
+ $this->cluster_ip = '127.0.0.4';
+ $this->untrusted_ip = '0.0.0.0';
+
+ $_SERVER['REMOTE_ADDR'] = $this->remote_ip;
+ unset($_SERVER['HTTP_X_FORWARDED_FOR']);
+ unset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']);
+
+ parent::setUp();
+ }
+
+ /**
+ * Implementation of tearDown().
+ */
+ function tearDown() {
+ $_SERVER = $this->oldserver;
+ parent::tearDown();
+ }
+
+ /**
+ * testIPAddress
+ */
+ function testIPAddress() {
+ // Test the normal IP address.
+ $this->assertTrue(
+ ip_address(true) == $this->remote_ip,
+ t('Got remote IP address')
+ );
+
+ // Proxy forwarding on but no proxy addresses defined.
+ variable_set('reverse_proxy', 1);
+ $this->assertTrue(
+ ip_address(true) == $this->remote_ip,
+ t('Proxy forwarding without trusted proxies got remote IP address')
+ );
+
+ // Proxy forwarding on and proxy address not trusted.
+ variable_set('reverse_proxy_addresses', array($this->proxy_ip));
+ $_SERVER['REMOTE_ADDR'] = $this->untrusted_ip;
+ $this->assertTrue(
+ ip_address(true) == $this->untrusted_ip,
+ t('Proxy forwarding with untrusted proxy got remote IP address')
+ );
+
+ // Proxy forwarding on and proxy address trusted.
+ $_SERVER['REMOTE_ADDR'] = $this->proxy_ip;
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = $this->forwarded_ip;
+ $this->assertTrue(
+ ip_address(true) == $this->forwarded_ip,
+ t('Proxy forwarding with trusted proxy got forwarded IP address')
+ );
+
+ // Cluster environment.
+ $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'] = $this->cluster_ip;
+ $this->assertTrue(
+ ip_address(true) == $this->cluster_ip,
+ t('Cluster environment got cluster client IP')
+ );
+ }
+}
diff --git a/includes/tests/common.test b/includes/tests/common.test
new file mode 100644
index 000000000..d3f907608
--- /dev/null
+++ b/includes/tests/common.test
@@ -0,0 +1,54 @@
+<?php
+
+class CommonFormatSizeTestCase extends DrupalWebTestCase {
+
+ /**
+ * Implementation of getInfo().
+ */
+ function getInfo() {
+ return array(
+ 'name' => t('Format size test'),
+ 'description' => t('Parse a predefined amount of bytes and compare the output with the expected value.'),
+ 'group' => t('System')
+ );
+ }
+
+ /**
+ * Implementation of setUp().
+ */
+ function setUp() {
+ $this->exact_test_cases = array(
+ '1 byte' => 1, // byte
+ '1 KB' => 1000, // kilobyte
+ '1 MB' => 1000000, // megabyte
+ '1 GB' => 1000000000, // gigabyte
+ '1 TB' => 1000000000000, // terabyte
+ '1 PB' => 1000000000000000, // petabyte
+ '1 EB' => 1000000000000000000, // exabyte
+ '1 ZB' => 1000000000000000000000, // zettabyte
+ '1 YB' => 1000000000000000000000000, // yottabyte
+ );
+ $this->rounded_test_cases = array(
+ '2 bytes' => 2, // bytes
+ '1 MB' => 999999, // 1 MB (not 1000 kilobyte!)
+ '3.62 MB' => 3623651, // megabytes
+ '67.23 PB' => 67234178751368124, // petabytes
+ '235.35 YB' => 235346823821125814962843827, // yottabytes
+ );
+ parent::setUp();
+ }
+
+ /**
+ * testCommonFormatSize
+ */
+ function testCommonFormatSize() {
+ foreach (array($this->exact_test_cases, $this->rounded_test_cases) as $test_cases) {
+ foreach ($test_cases as $expected => $size) {
+ $this->assertTrue(
+ ($result = format_size($size, NULL)) == $expected,
+ $expected . " == " . $result . " (" . $size . " bytes) %s"
+ );
+ }
+ }
+ }
+}
diff --git a/includes/tests/registry.test b/includes/tests/registry.test
new file mode 100644
index 000000000..93fea4009
--- /dev/null
+++ b/includes/tests/registry.test
@@ -0,0 +1,152 @@
+<?php
+
+class RegistryParseFileTestCase extends DrupalWebTestCase {
+
+ /**
+ * Implementation of getInfo().
+ */
+ function getInfo() {
+ return array(
+ 'name' => t('Registry parse file test'),
+ 'description' => t('Parse a simple file and check that its resources are saved to the database.'),
+ 'group' => t('System')
+ );
+ }
+
+ /**
+ * Implementation of setUp().
+ */
+ function setUp() {
+ $this->fileName = 'registry_test_' . md5(rand());
+ $this->functionName = 'registry_test_function' . md5(rand());
+ $this->className = 'registry_test_class' . md5(rand());
+ $this->interfaceName = 'registry_test_interface' . md5(rand());
+ parent::setUp();
+ }
+
+ /**
+ * testRegistryParseFile
+ */
+ function testRegistryParseFile() {
+ _registry_parse_file($this->fileName, $this->getFileContents());
+ foreach (array('functionName', 'className', 'interfaceName') as $resource) {
+ $foundName = db_result(db_query("SELECT name FROM {registry} WHERE name = '%s'", $this->$resource));
+ $this->assertTrue($this->$resource == $foundName, t('Resource "@resource" found.', array('@resource' => $this->$resource)));
+ }
+ }
+
+ /**
+ * getFileContents
+ */
+ function getFileContents() {
+ $file_contents = <<<CONTENTS
+<?php
+
+function {$this->functionName}() {}
+
+class {$this->className} {}
+
+interface {$this->interfaceName} {}
+
+CONTENTS;
+ return $file_contents;
+ }
+
+}
+
+class RegistryParseFilesTestCase extends DrupalWebTestCase {
+
+ protected $fileTypes = array('new', 'existing_changed');
+
+ /**
+ * Implementation of getInfo().
+ */
+ function getInfo() {
+ return array(
+ 'name' => t('Registry parse files test'),
+ 'description' => t('Read two a simple files from disc, and check that their resources are saved to the database.'),
+ 'group' => t('System')
+ );
+ }
+
+ /**
+ * Implementation of setUp().
+ */
+ function setUp() {
+ parent::setUp();
+ // Create files with some php to parse - one 'new', one 'existing' so
+ // we test all the important code paths in _registry_parse_files.
+ foreach ($this->fileTypes as $fileType) {
+ $this->$fileType = new StdClass();
+ $this->$fileType->fileName = file_directory_path() . '/registry_test_' . md5(rand());
+ $this->$fileType->functionName = 'registry_test_function' . md5(rand());
+ $this->$fileType->className = 'registry_test_class' . md5(rand());
+ $this->$fileType->interfaceName = 'registry_test_interface' . md5(rand());
+ $this->$fileType->contents = $this->getFileContents($fileType);
+ file_save_data($this->$fileType->contents, $this->$fileType->fileName);
+
+ if ($fileType == 'existing_changed') {
+ // Insert a record with a dodgy md5.
+ $this->$fileType->fakeMD5 = md5($this->$fileType->contents . rand());
+ db_query("INSERT INTO {registry_file} (md5, filename) VALUES ('%s', '%s')", $this->$fileType->fakeMD5, './' . $this->$fileType->fileName);
+
+ // Insert some fake resource records.
+ foreach (array('function', 'class', 'interface') as $type) {
+ db_query("INSERT INTO {registry} (name, type, filename) VALUES ('%s', '%s', '%s')", $type . md5(rand()), $type, './' . $this->$fileType->fileName);
+ }
+ }
+ }
+ }
+
+ /**
+ * testRegistryParseFiles
+ */
+ function testRegistryParseFiles() {
+ _registry_parse_files($this->getFiles());
+ foreach ($this->fileTypes as $fileType) {
+ // Test that we have all the right resources.
+ foreach (array('functionName', 'className', 'interfaceName') as $resource) {
+ $foundName = db_result(db_query("SELECT name FROM {registry} WHERE name = '%s'", $this->$fileType->$resource));
+ $this->assertTrue($this->$fileType->$resource == $foundName, t('Resource "@resource" found.', array('@resource' => $this->$fileType->$resource)));
+ }
+ // Test that we have the right md5.
+ $md5 = db_result(db_query("SELECT md5 FROM {registry_file} WHERE filename = '%s'", './' . $this->$fileType->fileName));
+ $this->assertTrue(md5($this->$fileType->contents) == $md5, t('MD5 for "@filename" matched.' . $fileType . $md5, array('@filename' => $this->$fileType->fileName)));
+ }
+ }
+
+ /**
+ * getFiles
+ */
+ function getFiles() {
+ $files = array();
+ foreach ($this->fileTypes as $fileType) {
+ if ($fileType == 'existing_changed') {
+ $files['./' . $this->$fileType->fileName] = array('md5' => $this->$fileType->fakeMD5);
+ }
+ else {
+ $files['./' . $this->$fileType->fileName] = array();
+ }
+ }
+ return $files;
+ }
+
+ /**
+ * getFileContents
+ */
+ function getFileContents($fileType) {
+ $file_contents = <<<CONTENTS
+<?php
+
+function {$this->$fileType->functionName}() {}
+
+class {$this->$fileType->className} {}
+
+interface {$this->$fileType->interfaceName} {}
+
+CONTENTS;
+ return $file_contents;
+ }
+
+}
+
diff --git a/includes/tests/xmlrpc.test b/includes/tests/xmlrpc.test
new file mode 100644
index 000000000..72a230e43
--- /dev/null
+++ b/includes/tests/xmlrpc.test
@@ -0,0 +1,126 @@
+<?php
+// $Id$
+
+class XMLRPCValidator1Test extends DrupalWebTestCase {
+ /**
+ * Implementation of getInfo().
+ */
+ function getInfo() {
+ return array(
+ 'name' => t('XML-RPC validator'),
+ 'description' => t('See !validator-link. note: simpletest_xmlrpc.module must be enabled', array('!validator-link' => l('the xmlrpc validator1 specification', 'http://www.xmlrpc.com/validator1Docs'))),
+ 'group' => t('XML-RPC')
+ );
+ }
+
+ function setUp() {
+ parent::setUp('simpletest_xmlrpc');
+ }
+
+ function test_run_all_tests() {
+ if (!module_exists('simpletest_xmlrpc')) {
+ return FALSE;
+ }
+ $xml_url = url(NULL, array('absolute' => TRUE)) . 'xmlrpc.php';
+ srand();
+ mt_srand();
+
+
+ $array_1 = array(array('curly' => mt_rand(-100,100)),
+ array('curly' => mt_rand(-100,100)),
+ array('larry' => mt_rand(-100,100)),
+ array('larry' => mt_rand(-100,100)),
+ array('moe' => mt_rand(-100,100)),
+ array('moe' => mt_rand(-100,100)),
+ array('larry' => mt_rand(-100,100)));
+ shuffle($array_1);
+ $l_res_1 = simpletest_xmlrpc_arrayOfStructsTest($array_1);
+ $r_res_1 = xmlrpc($xml_url, 'validator1.arrayOfStructsTest', $array_1);
+ $this->assertIdentical($l_res_1, $r_res_1, 'array of structs test: %s');
+
+
+ $string_2 = 't\'&>>zf"md>yr>xlcev<h<"k&j<og"w&&>">>uai"np&s>>q\'&b<>"&&&';
+ $l_res_2 = simpletest_xmlrpc_countTheEntities($string_2);
+ $r_res_2 = xmlrpc($xml_url, 'validator1.countTheEntities', $string_2);
+ $this->assertIdentical($l_res_2, $r_res_2, 'count the entities test: %s');
+
+
+ $struct_3 = array('moe' => mt_rand(-100,100), 'larry' => mt_rand(-100,100), 'curly' => mt_rand(-100,100), 'homer' => mt_rand(-100,100));
+ $l_res_3 = simpletest_xmlrpc_easyStructTest($struct_3);
+ $r_res_3 = xmlrpc($xml_url, 'validator1.easyStructTest', $struct_3);
+ $this->assertIdentical($l_res_3, $r_res_3, 'easy struct test: %s');
+
+
+ $struct_4 = array('sub1' => array('bar' => 13),
+ 'sub2' => 14,
+ 'sub3' => array('foo' => 1, 'baz' => 2),
+ 'sub4' => array('ss' => array('sss' => array('ssss' => 'sssss'))));
+ $l_res_4 = simpletest_xmlrpc_echoStructTest($struct_4);
+ $r_res_4 = xmlrpc($xml_url, 'validator1.echoStructTest', $struct_4);
+ $this->assertIdentical($l_res_4, $r_res_4, 'echo struct test: %s');
+
+ $int_5 = mt_rand(-100,100);
+ $bool_5 = (($int_5 % 2) == 0);
+ $string_5 = $this->randomName();
+ $double_5 = (double)(mt_rand(-1000,1000) / 100);
+ $time_5 = time();
+ $base64_5 = $this->randomName(100);
+ $l_res_5 = simpletest_xmlrpc_manyTypesTest($int_5, $bool_5, $string_5, $double_5, xmlrpc_date($time_5), $base64_5);
+ $l_res_5[5] = $l_res_5[5]->data; /* override warpping */
+ $r_res_5 = xmlrpc($xml_url, 'validator1.manyTypesTest', $int_5, $bool_5, $string_5, $double_5, xmlrpc_date($time_5), xmlrpc_base64($base64_5));
+ /* Contains objects, objects are not equal */
+ // See http://drupal.org/node/37766 why this currnetly fails
+ $this->assertEqual($l_res_5, $r_res_5, 'many types test: %s');
+
+
+ $size = mt_rand(100,200);
+ $array_6 = array();
+ for ($i = 0; $i < $size; $i++) {
+ $array_6[] = $this->randomName(mt_rand(8,12));
+ }
+
+ $l_res_6 = simpletest_xmlrpc_moderateSizeArrayCheck($array_6);
+ $r_res_6 = xmlrpc($xml_url, 'validator1.moderateSizeArrayCheck', $array_6);
+ $this->assertIdentical($l_res_6, $r_res_6, 'moderate size array check: %s');
+
+
+ $struct_7 = array();
+ for ($y = 2000; $y < 2002; $y++) {
+ for ($m = 3; $m < 5; $m++) {
+ for ($d = 1; $d < 6; $d++) {
+ $ys = (string)$y;
+ $ms = sprintf('%02d', $m);
+ $ds = sprintf('%02d', $d);
+ $struct_7[$ys][$ms][$ds]['moe'] = mt_rand(-100,100);
+ $struct_7[$ys][$ms][$ds]['larry'] = mt_rand(-100,100);
+ $struct_7[$ys][$ms][$ds]['curly'] = mt_rand(-100,100);
+ }
+ }
+ }
+ $l_res_7 = simpletest_xmlrpc_nestedStructTest($struct_7);
+ $r_res_7 = xmlrpc($xml_url, 'validator1.nestedStructTest', $struct_7);
+ $this->assertIdentical($l_res_7, $r_res_7, 'nested struct test: %s');
+
+
+ $int_8 = mt_rand(-100,100);
+ $l_res_8 = simpletest_xmlrpc_simpleStructReturnTest($int_8);
+ $r_res_8 = xmlrpc($xml_url, 'validator1.simpleStructReturnTest', $int_8);
+ $this->assertIdentical($l_res_8, $r_res_8, 'nested struct test: %s');
+
+ /* Now test multicall */
+ $x = array();
+ $x[] = array('validator1.arrayOfStructsTest', $array_1);
+ $x[] = array('validator1.countTheEntities', $string_2);
+ $x[] = array('validator1.easyStructTest', $struct_3);
+ $x[] = array('validator1.echoStructTest', $struct_4);
+ $x[] = array('validator1.manyTypesTest', $int_5, $bool_5, $string_5, $double_5, xmlrpc_date($time_5), xmlrpc_base64($base64_5));
+ $x[] = array('validator1.moderateSizeArrayCheck', $array_6);
+ $x[] = array('validator1.nestedStructTest', $struct_7);
+ $x[] = array('validator1.simpleStructReturnTest', $int_8);
+
+ $a_l_res = array($l_res_1, $l_res_2, $l_res_3, $l_res_4, $l_res_5, $l_res_6, $l_res_7, $l_res_8);
+ $a_r_res = xmlrpc($xml_url, $x);
+ $this->assertEqual($a_l_res, $a_r_res, 'multicall equals result');
+ }
+}
+?>