icingaweb2/test/php/library/Icinga/File/Storage/LocalFileStorageTest.php
Alexander Aleksandrovič Klimov 5333f2deb7
Disable deprecation warnings unless ICINGAWEB_ENVIRONMENT is set to "dev" (#5359)
in ApplicationBootstrap#setupErrorHandling(). In webrouter.php disable
them unconditionally (until ApplicationBootstrap#setupErrorHandling())
not to duplicate the check. ApplicationBootstrap#setupErrorHandling())
is called pretty early, so we won't miss much.

fixes #5117

* In addition, this provides #5269 and mitigates #5152 in production
where ICINGAWEB_ENVIRONMENT isn't set.
2025-05-05 17:58:28 +02:00

216 lines
6.2 KiB
PHP

<?php
/* Icinga Web 2 | (c) 2017 Icinga Development Team | GPLv2+ */
namespace Tests\Icinga\File\Storage;
use ErrorException;
use Exception;
use Icinga\File\Storage\LocalFileStorage;
use Icinga\File\Storage\TemporaryLocalFileStorage;
use Icinga\Test\BaseTestCase;
class LocalFileStorageTest extends BaseTestCase
{
/**
* @var int
*/
protected $oldErrorReportingLevel;
public function __construct($name = null, array $data = array(), $dataName = '')
{
parent::__construct($name, $data, $dataName);
$this->oldErrorReportingLevel = error_reporting();
error_reporting(E_ALL);
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
if (error_reporting() === 0) {
// Error was suppressed with the @-operator
return false; // Continue with the normal error handler
}
switch ($errno) {
case E_NOTICE:
case E_WARNING:
case E_RECOVERABLE_ERROR:
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
return false; // Continue with the normal error handler
});
}
public function __destruct()
{
error_reporting($this->oldErrorReportingLevel);
restore_error_handler();
}
public function testGetIterator()
{
$lfs = new TemporaryLocalFileStorage();
$lfs->create('foobar', 'Hello world!');
foreach ($lfs as $path => $_) {
$this->assertEquals($lfs->resolvePath('foobar'), $path);
}
}
public function testGetIteratorThrowsNotReadableError()
{
$this->expectException(\Icinga\Exception\NotReadableError::class);
$lfs = new LocalFileStorage('/notreadabledirectory');
$lfs->getIterator();
}
public function testHas()
{
$lfs = new TemporaryLocalFileStorage();
static::assertFalse($lfs->has('foobar'));
$lfs->create('foobar', 'Hello world!');
static::assertTrue($lfs->has('foobar'));
}
public function testCreate()
{
$lfs = new TemporaryLocalFileStorage();
$lfs->create('foo/bar', 'Hello world!');
static::assertSame('Hello world!', $lfs->read('foo/bar'));
}
public function testCreateThrowsAlreadyExistsException()
{
$this->expectException(\Icinga\Exception\AlreadyExistsException::class);
$lfs = new TemporaryLocalFileStorage();
$lfs->create('foobar', 'Hello world!');
$lfs->create('foobar', 'Hello world!');
}
public function testCreateThrowsNotWritableError()
{
$this->expectException(\Icinga\Exception\NotWritableError::class);
$lfs = new LocalFileStorage('/notwritabledirectory');
$lfs->create('foobar', 'Hello world!');
}
public function testRead()
{
$lfs = new TemporaryLocalFileStorage();
$lfs->create('foobar', 'Hello world!');
static::assertSame('Hello world!', $lfs->read('foobar'));
}
public function testReadThrowsNotFoundError()
{
$this->expectException(\Icinga\Exception\NotFoundError::class);
$lfs = new TemporaryLocalFileStorage();
$lfs->read('foobar');
}
public function testReadThrowsNotReadableError()
{
$this->expectException(\Icinga\Exception\NotReadableError::class);
$lfs = new TemporaryLocalFileStorage();
$lfs->create('foobar', 'Hello world!');
chmod($lfs->resolvePath('foobar'), 0);
$lfs->read('foobar');
}
public function testUpdate()
{
$lfs = new TemporaryLocalFileStorage();
$lfs->create('foobar', 'Hello world!');
$lfs->update('foobar', 'Hello universe!');
static::assertSame('Hello universe!', $lfs->read('foobar'));
}
public function testUpdateThrowsNotFoundError()
{
$this->expectException(\Icinga\Exception\NotFoundError::class);
$lfs = new TemporaryLocalFileStorage();
$lfs->update('foobar', 'Hello universe!');
}
public function testUpdateThrowsNotWritableError()
{
$this->expectException(\Icinga\Exception\NotWritableError::class);
$lfs = new TemporaryLocalFileStorage();
$lfs->create('foobar', 'Hello world!');
chmod($lfs->resolvePath('foobar'), 0);
$lfs->update('foobar', 'Hello universe!');
}
public function testDelete()
{
$lfs = new TemporaryLocalFileStorage();
$lfs->create('foobar', 'Hello world!');
$lfs->delete('foobar');
static::assertFalse($lfs->has('foobar'));
}
public function testDeleteThrowsNotFoundError()
{
$this->expectException(\Icinga\Exception\NotFoundError::class);
$lfs = new TemporaryLocalFileStorage();
$lfs->delete('foobar');
}
public function testDeleteThrowsNotWritableError()
{
$this->expectException(\Icinga\Exception\NotWritableError::class);
$lfs = new TemporaryLocalFileStorage();
$lfs->create('foobar', 'Hello world!');
$baseDir = dirname($lfs->resolvePath('foobar'));
chmod($baseDir, 0500);
try {
$lfs->delete('foobar');
} catch (Exception $e) {
chmod($baseDir, 0700);
throw $e;
}
chmod($baseDir, 0700);
}
public function testResolvePath()
{
$lfs = new LocalFileStorage('/notreadabledirectory');
static::assertSame('/notreadabledirectory/foobar', $lfs->resolvePath('./notRelevant/../foobar'));
}
public function testResolvePathAssertExistence()
{
$lfs = new TemporaryLocalFileStorage();
$lfs->create('foobar', 'Hello world!');
$lfs->resolvePath('./notRelevant/../foobar', true);
}
public function testResolvePathThrowsNotFoundError()
{
$this->expectException(\Icinga\Exception\NotFoundError::class);
$lfs = new TemporaryLocalFileStorage();
$lfs->resolvePath('foobar', true);
}
public function testResolvePathThrowsInvalidArgumentException()
{
$this->expectException(\InvalidArgumentException::class);
$lfs = new LocalFileStorage('/notreadabledirectory');
$lfs->resolvePath('../foobar');
}
}