summaryrefslogtreecommitdiffstats
path: root/tests/Monolog/Formatter/NormalizerFormatterTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/Monolog/Formatter/NormalizerFormatterTest.php')
-rw-r--r--tests/Monolog/Formatter/NormalizerFormatterTest.php221
1 files changed, 105 insertions, 116 deletions
diff --git a/tests/Monolog/Formatter/NormalizerFormatterTest.php b/tests/Monolog/Formatter/NormalizerFormatterTest.php
index 57bcdf9..68b275d 100644
--- a/tests/Monolog/Formatter/NormalizerFormatterTest.php
+++ b/tests/Monolog/Formatter/NormalizerFormatterTest.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
/*
* This file is part of the Monolog package.
@@ -14,7 +14,7 @@ namespace Monolog\Formatter;
/**
* @covers Monolog\Formatter\NormalizerFormatter
*/
-class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
+class NormalizerFormatterTest extends \PHPUnit\Framework\TestCase
{
public function tearDown()
{
@@ -26,40 +26,40 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
public function testFormat()
{
$formatter = new NormalizerFormatter('Y-m-d');
- $formatted = $formatter->format(array(
+ $formatted = $formatter->format([
'level_name' => 'ERROR',
'channel' => 'meh',
'message' => 'foo',
- 'datetime' => new \DateTime,
- 'extra' => array('foo' => new TestFooNorm, 'bar' => new TestBarNorm, 'baz' => array(), 'res' => fopen('php://memory', 'rb')),
- 'context' => array(
+ 'datetime' => new \DateTimeImmutable,
+ 'extra' => ['foo' => new TestFooNorm, 'bar' => new TestBarNorm, 'baz' => [], 'res' => fopen('php://memory', 'rb')],
+ 'context' => [
'foo' => 'bar',
'baz' => 'qux',
'inf' => INF,
'-inf' => -INF,
'nan' => acos(4),
- ),
- ));
+ ],
+ ]);
- $this->assertEquals(array(
+ $this->assertEquals([
'level_name' => 'ERROR',
'channel' => 'meh',
'message' => 'foo',
'datetime' => date('Y-m-d'),
- 'extra' => array(
- 'foo' => '[object] (Monolog\\Formatter\\TestFooNorm: {"foo":"foo"})',
- 'bar' => '[object] (Monolog\\Formatter\\TestBarNorm: bar)',
- 'baz' => array(),
- 'res' => '[resource] (stream)',
- ),
- 'context' => array(
+ 'extra' => [
+ 'foo' => ['Monolog\\Formatter\\TestFooNorm' => ["foo" => "fooValue"]],
+ 'bar' => ['Monolog\\Formatter\\TestBarNorm' => 'bar'],
+ 'baz' => [],
+ 'res' => '[resource(stream)]',
+ ],
+ 'context' => [
'foo' => 'bar',
'baz' => 'qux',
'inf' => 'INF',
'-inf' => '-INF',
'nan' => 'NaN',
- ),
- ), $formatted);
+ ],
+ ], $formatted);
}
public function testFormatExceptions()
@@ -67,22 +67,22 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
$formatter = new NormalizerFormatter('Y-m-d');
$e = new \LogicException('bar');
$e2 = new \RuntimeException('foo', 0, $e);
- $formatted = $formatter->format(array(
+ $formatted = $formatter->format([
'exception' => $e2,
- ));
+ ]);
$this->assertGreaterThan(5, count($formatted['exception']['trace']));
$this->assertTrue(isset($formatted['exception']['previous']));
unset($formatted['exception']['trace'], $formatted['exception']['previous']);
- $this->assertEquals(array(
- 'exception' => array(
+ $this->assertEquals([
+ 'exception' => [
'class' => get_class($e2),
'message' => $e2->getMessage(),
'code' => $e2->getCode(),
'file' => $e2->getFile().':'.$e2->getLine(),
- ),
- ), $formatted);
+ ],
+ ], $formatted);
}
public function testFormatSoapFaultException()
@@ -93,14 +93,14 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
$formatter = new NormalizerFormatter('Y-m-d');
$e = new \SoapFault('foo', 'bar', 'hello', 'world');
- $formatted = $formatter->format(array(
+ $formatted = $formatter->format([
'exception' => $e,
- ));
+ ]);
unset($formatted['exception']['trace']);
- $this->assertEquals(array(
- 'exception' => array(
+ $this->assertEquals([
+ 'exception' => [
'class' => 'SoapFault',
'message' => 'bar',
'code' => 0,
@@ -108,58 +108,59 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
'faultcode' => 'foo',
'faultactor' => 'hello',
'detail' => 'world',
- ),
- ), $formatted);
+ ],
+ ], $formatted);
}
public function testFormatToStringExceptionHandle()
{
$formatter = new NormalizerFormatter('Y-m-d');
- $this->setExpectedException('RuntimeException', 'Could not convert to string');
- $formatter->format(array(
+ $this->expectException('RuntimeException');
+ $this->expectExceptionMessage('Could not convert to string');
+ $formatter->format([
'myObject' => new TestToStringError(),
- ));
+ ]);
}
public function testBatchFormat()
{
$formatter = new NormalizerFormatter('Y-m-d');
- $formatted = $formatter->formatBatch(array(
- array(
+ $formatted = $formatter->formatBatch([
+ [
'level_name' => 'CRITICAL',
'channel' => 'test',
'message' => 'bar',
- 'context' => array(),
- 'datetime' => new \DateTime,
- 'extra' => array(),
- ),
- array(
+ 'context' => [],
+ 'datetime' => new \DateTimeImmutable,
+ 'extra' => [],
+ ],
+ [
'level_name' => 'WARNING',
'channel' => 'log',
'message' => 'foo',
- 'context' => array(),
- 'datetime' => new \DateTime,
- 'extra' => array(),
- ),
- ));
- $this->assertEquals(array(
- array(
+ 'context' => [],
+ 'datetime' => new \DateTimeImmutable,
+ 'extra' => [],
+ ],
+ ]);
+ $this->assertEquals([
+ [
'level_name' => 'CRITICAL',
'channel' => 'test',
'message' => 'bar',
- 'context' => array(),
+ 'context' => [],
'datetime' => date('Y-m-d'),
- 'extra' => array(),
- ),
- array(
+ 'extra' => [],
+ ],
+ [
'level_name' => 'WARNING',
'channel' => 'log',
'message' => 'foo',
- 'context' => array(),
+ 'context' => [],
'datetime' => date('Y-m-d'),
- 'extra' => array(),
- ),
- ), $formatted);
+ 'extra' => [],
+ ],
+ ], $formatted);
}
/**
@@ -186,11 +187,20 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
$formatter = new NormalizerFormatter();
$reflMethod = new \ReflectionMethod($formatter, 'toJson');
$reflMethod->setAccessible(true);
- $res = $reflMethod->invoke($formatter, array($foo, $bar), true);
+ $res = $reflMethod->invoke($formatter, [$foo, $bar], true);
restore_error_handler();
- $this->assertEquals(@json_encode(array($foo, $bar)), $res);
+ $this->assertEquals(@json_encode([$foo, $bar]), $res);
+ }
+
+ public function testCanNormalizeReferences()
+ {
+ $formatter = new NormalizerFormatter();
+ $x = ['foo' => 'bar'];
+ $y = ['x' => &$x];
+ $x['y'] = &$y;
+ $formatter->format($y);
}
public function testIgnoresInvalidTypes()
@@ -210,11 +220,11 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
$formatter = new NormalizerFormatter();
$reflMethod = new \ReflectionMethod($formatter, 'toJson');
$reflMethod->setAccessible(true);
- $res = $reflMethod->invoke($formatter, array($resource), true);
+ $res = $reflMethod->invoke($formatter, [$resource], true);
restore_error_handler();
- $this->assertEquals(@json_encode(array($resource)), $res);
+ $this->assertEquals(@json_encode([$resource]), $res);
}
public function testNormalizeHandleLargeArrays()
@@ -240,10 +250,6 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
*/
public function testThrowsOnInvalidEncoding()
{
- if (version_compare(PHP_VERSION, '5.5.0', '<')) {
- // Ignore the warning that will be emitted by PHP <5.5.0
- \PHPUnit_Framework_Error_Warning::$enabled = false;
- }
$formatter = new NormalizerFormatter();
$reflMethod = new \ReflectionMethod($formatter, 'toJson');
$reflMethod->setAccessible(true);
@@ -251,31 +257,18 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
// send an invalid unicode sequence as a object that can't be cleaned
$record = new \stdClass;
$record->message = "\xB1\x31";
- $res = $reflMethod->invoke($formatter, $record);
- if (PHP_VERSION_ID < 50500 && $res === '{"message":null}') {
- throw new \RuntimeException('PHP 5.3/5.4 throw a warning and null the value instead of returning false entirely');
- }
+ $reflMethod->invoke($formatter, $record);
}
public function testConvertsInvalidEncodingAsLatin9()
{
- if (version_compare(PHP_VERSION, '5.5.0', '<')) {
- // Ignore the warning that will be emitted by PHP <5.5.0
- \PHPUnit_Framework_Error_Warning::$enabled = false;
- }
$formatter = new NormalizerFormatter();
$reflMethod = new \ReflectionMethod($formatter, 'toJson');
$reflMethod->setAccessible(true);
- $res = $reflMethod->invoke($formatter, array('message' => "\xA4\xA6\xA8\xB4\xB8\xBC\xBD\xBE"));
+ $res = $reflMethod->invoke($formatter, ['message' => "\xA4\xA6\xA8\xB4\xB8\xBC\xBD\xBE"]);
- if (version_compare(PHP_VERSION, '5.5.0', '>=')) {
- $this->assertSame('{"message":"€ŠšŽžŒœŸ"}', $res);
- } else {
- // PHP <5.5 does not return false for an element encoding failure,
- // instead it emits a warning (possibly) and nulls the value.
- $this->assertSame('{"message":null}', $res);
- }
+ $this->assertSame('{"message":"€ŠšŽžŒœŸ"}', $res);
}
/**
@@ -295,19 +288,19 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
{
$obj = new \stdClass;
- return array(
- 'null' => array(null, null),
- 'int' => array(123, 123),
- 'float' => array(123.45, 123.45),
- 'bool false' => array(false, false),
- 'bool true' => array(true, true),
- 'ascii string' => array('abcdef', 'abcdef'),
- 'latin9 string' => array("\xB1\x31\xA4\xA6\xA8\xB4\xB8\xBC\xBD\xBE\xFF", '±1€ŠšŽžŒœŸÿ'),
- 'unicode string' => array('¤¦¨´¸¼½¾€ŠšŽžŒœŸ', '¤¦¨´¸¼½¾€ŠšŽžŒœŸ'),
- 'empty array' => array(array(), array()),
- 'array' => array(array('abcdef'), array('abcdef')),
- 'object' => array($obj, $obj),
- );
+ return [
+ 'null' => [null, null],
+ 'int' => [123, 123],
+ 'float' => [123.45, 123.45],
+ 'bool false' => [false, false],
+ 'bool true' => [true, true],
+ 'ascii string' => ['abcdef', 'abcdef'],
+ 'latin9 string' => ["\xB1\x31\xA4\xA6\xA8\xB4\xB8\xBC\xBD\xBE\xFF", '±1€ŠšŽžŒœŸÿ'],
+ 'unicode string' => ['¤¦¨´¸¼½¾€ŠšŽžŒœŸ', '¤¦¨´¸¼½¾€ŠšŽžŒœŸ'],
+ 'empty array' => [[], []],
+ 'array' => [['abcdef'], ['abcdef']],
+ 'object' => [$obj, $obj],
+ ];
}
/**
@@ -321,32 +314,29 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
$reflMethod = new \ReflectionMethod($formatter, 'handleJsonError');
$reflMethod->setAccessible(true);
- $this->setExpectedException('RuntimeException', $msg);
+ $this->expectException('RuntimeException');
+ $this->expectExceptionMessage($msg);
$reflMethod->invoke($formatter, $code, 'faked');
}
public function providesHandleJsonErrorFailure()
{
- return array(
- 'depth' => array(JSON_ERROR_DEPTH, 'Maximum stack depth exceeded'),
- 'state' => array(JSON_ERROR_STATE_MISMATCH, 'Underflow or the modes mismatch'),
- 'ctrl' => array(JSON_ERROR_CTRL_CHAR, 'Unexpected control character found'),
- 'default' => array(-1, 'Unknown error'),
- );
+ return [
+ 'depth' => [JSON_ERROR_DEPTH, 'Maximum stack depth exceeded'],
+ 'state' => [JSON_ERROR_STATE_MISMATCH, 'Underflow or the modes mismatch'],
+ 'ctrl' => [JSON_ERROR_CTRL_CHAR, 'Unexpected control character found'],
+ 'default' => [-1, 'Unknown error'],
+ ];
}
+ // This happens i.e. in React promises or Guzzle streams where stream wrappers are registered
+ // and no file or line are included in the trace because it's treated as internal function
public function testExceptionTraceWithArgs()
{
if (defined('HHVM_VERSION')) {
$this->markTestSkipped('Not supported in HHVM since it detects errors differently');
}
- // This happens i.e. in React promises or Guzzle streams where stream wrappers are registered
- // and no file or line are included in the trace because it's treated as internal function
- set_error_handler(function ($errno, $errstr, $errfile, $errline) {
- throw new \ErrorException($errstr, 0, $errno, $errfile, $errline);
- });
-
try {
// This will contain $resource and $wrappedResource as arguments in the trace item
$resource = fopen('php://memory', 'rw+');
@@ -354,25 +344,24 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
$wrappedResource = new TestFooNorm;
$wrappedResource->foo = $resource;
// Just do something stupid with a resource/wrapped resource as argument
- array_keys($wrappedResource);
- } catch (\Exception $e) {
- restore_error_handler();
+ $arr = [$wrappedResource, $resource];
+ // modifying the array inside throws a "usort(): Array was modified by the user comparison function"
+ usort($arr, function ($a, $b) {
+ throw new \ErrorException('Foo');
+ });
+ } catch (\Throwable $e) {
}
$formatter = new NormalizerFormatter();
- $record = array('context' => array('exception' => $e));
+ $record = ['context' => ['exception' => $e]];
$result = $formatter->format($record);
$this->assertRegExp(
- '%"resource":"\[resource\] \(stream\)"%',
+ '%\[resource\(stream\)\]%',
$result['context']['exception']['trace'][0]
);
- if (version_compare(PHP_VERSION, '5.5.0', '>=')) {
- $pattern = '%"wrappedResource":"\[object\] \(Monolog\\\\\\\\Formatter\\\\\\\\TestFooNorm: \)"%';
- } else {
- $pattern = '%\\\\"foo\\\\":null%';
- }
+ $pattern = '%\[\{"Monolog\\\\\\\\Formatter\\\\\\\\TestFooNorm":"JSON_ERROR"\}%';
// Tests that the wrapped resource is ignored while encoding, only works for PHP <= 5.4
$this->assertRegExp(
@@ -384,7 +373,7 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
class TestFooNorm
{
- public $foo = 'foo';
+ public $foo = 'fooValue';
}
class TestBarNorm