diff options
Diffstat (limited to 'tests/Monolog/Formatter/NormalizerFormatterTest.php')
-rw-r--r-- | tests/Monolog/Formatter/NormalizerFormatterTest.php | 221 |
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 |