Skip to content

Commit b7ce972

Browse files
committed
Allow assertions on error_log() output
1 parent fa8961d commit b7ce972

File tree

1 file changed

+33
-2
lines changed

1 file changed

+33
-2
lines changed

src/Framework/TestCase.php

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@
2222
use function defined;
2323
use function error_clear_last;
2424
use function explode;
25+
use function fclose;
2526
use function getcwd;
2627
use function implode;
2728
use function in_array;
29+
use function ini_set;
2830
use function is_array;
2931
use function is_callable;
3032
use function is_int;
@@ -44,6 +46,9 @@
4446
use function set_exception_handler;
4547
use function sprintf;
4648
use function str_contains;
49+
use function stream_get_contents;
50+
use function stream_get_meta_data;
51+
use function tmpfile;
4752
use function trim;
4853
use AssertionError;
4954
use DeepCopy\DeepCopy;
@@ -174,7 +179,13 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T
174179
private bool $outputBufferingActive = false;
175180
private int $outputBufferingLevel;
176181
private bool $outputRetrievedForAssertion = false;
177-
private bool $doesNotPerformAssertions = false;
182+
private string $errorOutput = '';
183+
private ?string $errorOutputExpectedRegex = null;
184+
private ?string $errorOutputPrevious = null;
185+
186+
/** @var null|resource */
187+
private $errorOutputResource;
188+
private bool $doesNotPerformAssertions = false;
178189

179190
/**
180191
* @var list<Comparator>
@@ -1002,6 +1013,11 @@ final protected function expectOutputString(string $expectedString): void
10021013
$this->outputExpectedString = $expectedString;
10031014
}
10041015

1016+
final protected function expectErrorOutputRegex(string $expectedRegex): void
1017+
{
1018+
$this->errorOutputExpectedRegex = $expectedRegex;
1019+
}
1020+
10051021
/**
10061022
* @param class-string<Throwable> $exception
10071023
*/
@@ -1443,6 +1459,10 @@ private function startOutputBuffering(): void
14431459

14441460
$this->outputBufferingActive = true;
14451461
$this->outputBufferingLevel = ob_get_level();
1462+
1463+
$capture = tmpfile();
1464+
$this->errorOutputPrevious = ini_set('error_log', stream_get_meta_data($capture)['uri']);
1465+
$this->errorOutputResource = $capture;
14461466
}
14471467

14481468
private function stopOutputBuffering(): bool
@@ -1470,6 +1490,15 @@ private function stopOutputBuffering(): bool
14701490
return false;
14711491
}
14721492

1493+
if ($this->errorOutputResource !== null) {
1494+
$this->errorOutput = stream_get_contents($this->errorOutputResource);
1495+
fclose($this->errorOutputResource);
1496+
}
1497+
1498+
if ($this->errorOutputPrevious !== null) {
1499+
ini_set('error_log', $this->errorOutputPrevious);
1500+
}
1501+
14731502
$this->output = ob_get_clean();
14741503

14751504
$this->outputBufferingActive = false;
@@ -1866,6 +1895,8 @@ private function performAssertionsOnOutput(): void
18661895
$this->assertMatchesRegularExpression($this->outputExpectedRegex, $this->output);
18671896
} elseif ($this->outputExpectedString !== null) {
18681897
$this->assertSame($this->outputExpectedString, $this->output);
1898+
} elseif ($this->errorOutputExpectedRegex !== null) {
1899+
$this->assertMatchesRegularExpression($this->errorOutputExpectedRegex, $this->errorOutput);
18691900
}
18701901
} catch (ExpectationFailedException $e) {
18711902
$this->status = TestStatus::failure($e->getMessage());
@@ -2145,7 +2176,7 @@ private function isRegisteredFailure(Throwable $t): bool
21452176
*/
21462177
private function hasExpectationOnOutput(): bool
21472178
{
2148-
return is_string($this->outputExpectedString) || is_string($this->outputExpectedRegex);
2179+
return is_string($this->outputExpectedString) || is_string($this->outputExpectedRegex) || is_string($this->errorOutputExpectedRegex);
21492180
}
21502181

21512182
private function requirementsNotSatisfied(): bool

0 commit comments

Comments
 (0)