From 9c3a9383c82ff2e6dd21cb0553f74c8b3d2a3a9d Mon Sep 17 00:00:00 2001
From: Tim van Dijen <tvdijen@gmail.com>
Date: Tue, 5 May 2020 16:10:17 +0200
Subject: [PATCH] Revert IndexTest

---
 tests/routers/configLoader.php |  43 ++++++++++++
 tests/www/IndexTest.php        | 124 +++++++++++++++++++++++++++++++++
 2 files changed, 167 insertions(+)
 create mode 100644 tests/routers/configLoader.php
 create mode 100644 tests/www/IndexTest.php

diff --git a/tests/routers/configLoader.php b/tests/routers/configLoader.php
new file mode 100644
index 000000000..b148e80ba
--- /dev/null
+++ b/tests/routers/configLoader.php
@@ -0,0 +1,43 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This "router" (a script that's executed for every request received by PHP's built-in web server) will look
+ * for a file in the system's temporary directory, with the PID of the current process as its name, and the
+ * '.lock' extension. If the file exists, it will try to include it and preload SimpleSAMLphp's configuration with
+ * the $config array defined in that file.
+ * This is useful to configure SimpleSAMLphp dynamically when running inside the built-in server, so that
+ * we can test different configurations without the need to keep a structure of files.
+ *
+ * In order to use it:
+ *
+ * 1. Create an array with the SimpleSAMLphp configuration you would like to use.
+ * 2. Start the built-in server passing "configLoader" as the first parameter to the constructor:
+ *      $server = new BuiltInServer('configLoader');
+ *      $addr = $server->start();
+ * 3. Get the PID of the server once it has started:
+ *      $pid = $server->getPid();
+ * 4. Build the path to the file that this script will use:
+ *      $file = sys_get_temp_dir().'/'.$pid.'.lock';
+ * 5. Dump the configuration array to the file:
+ *      file_put_contents("<?php\n\$config = ".var_export($config, true).";\n");
+ * 6. Make a request to the server:
+ *      $server->get($query, $parameters);
+ * 7. Remove the temporary file when done:
+ *      unlink($file);
+ */
+
+include_once(sys_get_temp_dir() . '/' . getmypid() . '.lock');
+
+// load SimpleSAMLphp's autoloader
+require_once(dirname(__FILE__) . '/../../vendor/autoload.php');
+
+// initialize configuration
+if (isset($config)) {
+    \SimpleSAML\Configuration::loadFromArray($config, '[ARRAY]', 'simplesaml');
+}
+
+// let the script proceed
+// see: http://php.net/manual/en/features.commandline.webserver.php
+return false;
diff --git a/tests/www/IndexTest.php b/tests/www/IndexTest.php
new file mode 100644
index 000000000..1985d8388
--- /dev/null
+++ b/tests/www/IndexTest.php
@@ -0,0 +1,124 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SimpleSAML\Test\Web;
+
+use PHPUnit\Framework\TestCase;
+use SimpleSAML\TestUtils\BuiltInServer;
+
+/**
+ * Simple test for the www/index.php script.
+ *
+ * This test is intended mostly as a demonstration of how to test the public web interface in SimpleSAMLphp.
+ *
+ * @author Jaime Pérez Crespo <jaime.perez@uninett.no>
+ * @package SimpleSAMLphp
+ */
+class IndexTest extends TestCase
+{
+    /**
+     * @var \SimpleSAML\TestUtils\BuiltInServer
+     */
+    protected $server;
+
+    /**
+     * @var string
+     */
+    protected $server_addr;
+
+    /**
+     * @var int
+     */
+    protected $server_pid;
+
+    /**
+     * @var string
+     */
+    protected $shared_file;
+
+
+    /**
+     * The setup method that is run before any tests in this class.
+     * @return void
+     */
+    protected function setup(): void
+    {
+        $this->server = new BuiltInServer('configLoader');
+        $this->server_addr = $this->server->start();
+        $this->server_pid = $this->server->getPid();
+
+        $this->shared_file = sys_get_temp_dir() . '/' . $this->server_pid . '.lock';
+        @unlink($this->shared_file); // remove it if it exists
+    }
+
+
+    /**
+     * @param array $config
+     * @return void
+     */
+    protected function updateConfig(array $config): void
+    {
+        @unlink($this->shared_file);
+        $config = "<?php\n\$config = " . var_export($config, true) . ";\n";
+        file_put_contents($this->shared_file, $config);
+    }
+
+
+    /**
+     * A simple test to make sure the index.php file redirects appropriately to the right URL.
+     * @return void
+     */
+    public function testRedirection(): void
+    {
+        // test most basic redirection
+        $this->updateConfig([
+                'baseurlpath' => 'http://example.org/simplesaml/'
+        ]);
+        $resp = $this->server->get('/index.php', [], [
+            CURLOPT_FOLLOWLOCATION => 0,
+        ]);
+        $this->assertEquals('302', $resp['code']);
+        $this->assertEquals(
+            'http://example.org/simplesaml/module.php/core/login',
+            $resp['headers']['Location']
+        );
+
+        // test non-default path and https
+        $this->updateConfig([
+            'baseurlpath' => 'https://example.org/'
+        ]);
+        $resp = $this->server->get('/index.php', [], [
+            CURLOPT_FOLLOWLOCATION => 0,
+        ]);
+        $this->assertEquals('302', $resp['code']);
+        $this->assertEquals(
+            'https://example.org/module.php/core/login',
+            $resp['headers']['Location']
+        );
+
+        // test URL guessing
+        $this->updateConfig([
+            'baseurlpath' => '/simplesaml/'
+        ]);
+        $resp = $this->server->get('/index.php', [], [
+            CURLOPT_FOLLOWLOCATION => 0,
+        ]);
+        $this->assertEquals('302', $resp['code']);
+        $this->assertEquals(
+            'http://' . $this->server_addr . '/simplesaml/module.php/core/login',
+            $resp['headers']['Location']
+        );
+    }
+
+
+    /**
+     * The tear down method that is executed after all tests in this class.
+     * @return void
+     */
+    protected function tearDown(): void
+    {
+        unlink($this->shared_file);
+        $this->server->stop();
+    }
+}
-- 
GitLab