ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5
Monolog\Formatter\NormalizerFormatterTest Class Reference

Monolog More...

+ Inheritance diagram for Monolog\Formatter\NormalizerFormatterTest:
+ Collaboration diagram for Monolog\Formatter\NormalizerFormatterTest:

Public Member Functions

 testFormat ()
 
 testFormatExceptions ()
 
 testBatchFormat ()
 
 testIgnoresRecursiveObjectReferences ()
 Test issue #137. More...
 
 testIgnoresInvalidTypes ()
 
 testThrowsOnInvalidEncoding ()
 RuntimeException More...
 
 testExceptionTraceWithArgs ()
 

Detailed Description

Monolog

Definition at line 17 of file NormalizerFormatterTest.php.

Member Function Documentation

◆ testBatchFormat()

Monolog\Formatter\NormalizerFormatterTest::testBatchFormat ( )

Definition at line 81 of file NormalizerFormatterTest.php.

82  {
83  $formatter = new NormalizerFormatter('Y-m-d');
84  $formatted = $formatter->formatBatch(array(
85  array(
86  'level_name' => 'CRITICAL',
87  'channel' => 'test',
88  'message' => 'bar',
89  'context' => array(),
90  'datetime' => new \DateTime,
91  'extra' => array(),
92  ),
93  array(
94  'level_name' => 'WARNING',
95  'channel' => 'log',
96  'message' => 'foo',
97  'context' => array(),
98  'datetime' => new \DateTime,
99  'extra' => array(),
100  ),
101  ));
102  $this->assertEquals(array(
103  array(
104  'level_name' => 'CRITICAL',
105  'channel' => 'test',
106  'message' => 'bar',
107  'context' => array(),
108  'datetime' => date('Y-m-d'),
109  'extra' => array(),
110  ),
111  array(
112  'level_name' => 'WARNING',
113  'channel' => 'log',
114  'message' => 'foo',
115  'context' => array(),
116  'datetime' => date('Y-m-d'),
117  'extra' => array(),
118  ),
119  ), $formatted);
120  }

◆ testExceptionTraceWithArgs()

Monolog\Formatter\NormalizerFormatterTest::testExceptionTraceWithArgs ( )

Definition at line 193 of file NormalizerFormatterTest.php.

References $result.

194  {
195  if (defined('HHVM_VERSION')) {
196  $this->markTestSkipped('Not supported in HHVM since it detects errors differently');
197  }
198 
199  // This happens i.e. in React promises or Guzzle streams where stream wrappers are registered
200  // and no file or line are included in the trace because it's treated as internal function
201  set_error_handler(function ($errno, $errstr, $errfile, $errline) {
202  throw new \ErrorException($errstr, 0, $errno, $errfile, $errline);
203  });
204 
205  try {
206  // This will contain $resource and $wrappedResource as arguments in the trace item
207  $resource = fopen('php://memory', 'rw+');
208  fwrite($resource, 'test_resource');
209  $wrappedResource = new TestFooNorm;
210  $wrappedResource->foo = $resource;
211  // Just do something stupid with a resource/wrapped resource as argument
212  array_keys($wrappedResource);
213  } catch (\Exception $e) {
214  restore_error_handler();
215  }
216 
217  $formatter = new NormalizerFormatter();
218  $record = array('context' => array('exception' => $e));
219  $result = $formatter->format($record);
220 
221  $this->assertRegExp(
222  '%"resource":"\[resource\]"%',
223  $result['context']['exception']['trace'][0]
224  );
225 
226  if (version_compare(PHP_VERSION, '5.5.0', '>=')) {
227  $pattern = '%"wrappedResource":"\[object\] \(Monolog\\\\\\\\Formatter\\\\\\\\TestFooNorm: \)"%';
228  } else {
229  $pattern = '%\\\\"foo\\\\":null%';
230  }
231 
232  // Tests that the wrapped resource is ignored while encoding, only works for PHP <= 5.4
233  $this->assertRegExp(
234  $pattern,
235  $result['context']['exception']['trace'][0]
236  );
237  }
$result

◆ testFormat()

Monolog\Formatter\NormalizerFormatterTest::testFormat ( )

Definition at line 19 of file NormalizerFormatterTest.php.

20  {
21  $formatter = new NormalizerFormatter('Y-m-d');
22  $formatted = $formatter->format(array(
23  'level_name' => 'ERROR',
24  'channel' => 'meh',
25  'message' => 'foo',
26  'datetime' => new \DateTime,
27  'extra' => array('foo' => new TestFooNorm, 'bar' => new TestBarNorm, 'baz' => array(), 'res' => fopen('php://memory', 'rb')),
28  'context' => array(
29  'foo' => 'bar',
30  'baz' => 'qux',
31  'inf' => INF,
32  '-inf' => -INF,
33  'nan' => acos(4),
34  ),
35  ));
36 
37  $this->assertEquals(array(
38  'level_name' => 'ERROR',
39  'channel' => 'meh',
40  'message' => 'foo',
41  'datetime' => date('Y-m-d'),
42  'extra' => array(
43  'foo' => '[object] (Monolog\\Formatter\\TestFooNorm: {"foo":"foo"})',
44  'bar' => '[object] (Monolog\\Formatter\\TestBarNorm: bar)',
45  'baz' => array(),
46  'res' => '[resource]',
47  ),
48  'context' => array(
49  'foo' => 'bar',
50  'baz' => 'qux',
51  'inf' => 'INF',
52  '-inf' => '-INF',
53  'nan' => 'NaN',
54  )
55  ), $formatted);
56  }

◆ testFormatExceptions()

Monolog\Formatter\NormalizerFormatterTest::testFormatExceptions ( )

Definition at line 58 of file NormalizerFormatterTest.php.

59  {
60  $formatter = new NormalizerFormatter('Y-m-d');
61  $e = new \LogicException('bar');
62  $e2 = new \RuntimeException('foo', 0, $e);
63  $formatted = $formatter->format(array(
64  'exception' => $e2,
65  ));
66 
67  $this->assertGreaterThan(5, count($formatted['exception']['trace']));
68  $this->assertTrue(isset($formatted['exception']['previous']));
69  unset($formatted['exception']['trace'], $formatted['exception']['previous']);
70 
71  $this->assertEquals(array(
72  'exception' => array(
73  'class' => get_class($e2),
74  'message' => $e2->getMessage(),
75  'code' => $e2->getCode(),
76  'file' => $e2->getFile().':'.$e2->getLine(),
77  )
78  ), $formatted);
79  }

◆ testIgnoresInvalidTypes()

Monolog\Formatter\NormalizerFormatterTest::testIgnoresInvalidTypes ( )

Definition at line 153 of file NormalizerFormatterTest.php.

References $file, and $res.

154  {
155  // set up the recursion
156  $resource = fopen(__FILE__, 'r');
157 
158  // set an error handler to assert that the error is not raised anymore
159  $that = $this;
160  set_error_handler(function ($level, $message, $file, $line, $context) use ($that) {
161  if (error_reporting() & $level) {
162  restore_error_handler();
163  $that->fail("$message should not be raised");
164  }
165  });
166 
167  $formatter = new NormalizerFormatter();
168  $reflMethod = new \ReflectionMethod($formatter, 'toJson');
169  $reflMethod->setAccessible(true);
170  $res = $reflMethod->invoke($formatter, array($resource), true);
171 
172  restore_error_handler();
173 
174  $this->assertEquals(@json_encode(array($resource)), $res);
175  }
print $file

◆ testIgnoresRecursiveObjectReferences()

Monolog\Formatter\NormalizerFormatterTest::testIgnoresRecursiveObjectReferences ( )

Test issue #137.

Definition at line 125 of file NormalizerFormatterTest.php.

References $file, and $res.

126  {
127  // set up the recursion
128  $foo = new \stdClass();
129  $bar = new \stdClass();
130 
131  $foo->bar = $bar;
132  $bar->foo = $foo;
133 
134  // set an error handler to assert that the error is not raised anymore
135  $that = $this;
136  set_error_handler(function ($level, $message, $file, $line, $context) use ($that) {
137  if (error_reporting() & $level) {
138  restore_error_handler();
139  $that->fail("$message should not be raised");
140  }
141  });
142 
143  $formatter = new NormalizerFormatter();
144  $reflMethod = new \ReflectionMethod($formatter, 'toJson');
145  $reflMethod->setAccessible(true);
146  $res = $reflMethod->invoke($formatter, array($foo, $bar), true);
147 
148  restore_error_handler();
149 
150  $this->assertEquals(@json_encode(array($foo, $bar)), $res);
151  }
print $file

◆ testThrowsOnInvalidEncoding()

Monolog\Formatter\NormalizerFormatterTest::testThrowsOnInvalidEncoding ( )

RuntimeException

Definition at line 180 of file NormalizerFormatterTest.php.

References $res.

181  {
182  $formatter = new NormalizerFormatter();
183  $reflMethod = new \ReflectionMethod($formatter, 'toJson');
184  $reflMethod->setAccessible(true);
185 
186  // send an invalid unicode sequence
187  $res = $reflMethod->invoke($formatter, array('message' => "\xB1\x31"));
188  if (PHP_VERSION_ID < 50500 && $res === '{"message":null}') {
189  throw new \RuntimeException('PHP 5.3/5.4 throw a warning and null the value instead of returning false entirely');
190  }
191  }

The documentation for this class was generated from the following file: