1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
<?php
declare(strict_types=1);
namespace SimpleSAML\Test\Utils;
/**
* A helper class to aid in clearing global state that is set during SSP tests
*/
class StateClearer
{
/**
* Global state to restore between test runs
* @var array
*/
private $backups = [];
/**
* Class that implement \SimpleSAML\Utils\ClearableState and should have clearInternalState called between tests
* @var array
*/
private $clearableState = [
'SimpleSAML\Configuration',
'SimpleSAML\Metadata\MetaDataStorageHandler',
'SimpleSAML\Store',
'SimpleSAML\Session'
];
/**
* Environmental variables to unset
* @var array
*/
private $vars_to_unset = ['SIMPLESAMLPHP_CONFIG_DIR'];
/**
* @return void
*/
public function backupGlobals(): void
{
// Backup any state that is needed as part of processing, so we can restore it later.
// TODO: phpunit's backupGlobals = false, yet we are trying to do a similar thing here. Is that an issue?
$this->backups['$_COOKIE'] = $_COOKIE;
$this->backups['$_ENV'] = $_ENV;
$this->backups['$_FILES'] = $_FILES;
$this->backups['$_GET'] = $_GET;
$this->backups['$_POST'] = $_POST;
$this->backups['$_SERVER'] = $_SERVER;
/** @psalm-var array|null $_SESSION */
$this->backups['$_SESSION'] = isset($_SESSION) ? $_SESSION : [];
$this->backups['$_REQUEST'] = $_REQUEST;
}
/**
* Clear any global state.
* @return void
*/
public function clearGlobals(): void
{
if (!empty($this->backups)) {
$_COOKIE = $this->backups['$_COOKIE'];
$_ENV = $this->backups['$_ENV'];
$_FILES = $this->backups['$_FILES'];
$_GET = $this->backups['$_GET'];
$_POST = $this->backups['$_POST'];
$_SERVER = $this->backups['$_SERVER'];
$_SESSION = $this->backups['$_SESSION'];
$_REQUEST = $this->backups['$_REQUEST'];
} else {
//TODO: what should this behavior be?
}
}
/**
* Clear any SSP specific state, such as SSP enviormental variables or cached internals.
* @return void
*/
public function clearSSPState(): void
{
foreach ($this->clearableState as $var) {
$var::clearInternalState();
}
foreach ($this->vars_to_unset as $var) {
putenv($var);
}
}
}
|