1*d10b5556SXylle<?php 2*d10b5556SXylle 3*d10b5556SXyllenamespace Psr\Log\Test; 4*d10b5556SXylle 5*d10b5556SXylleuse Psr\Log\AbstractLogger; 6*d10b5556SXylle 7*d10b5556SXylle/** 8*d10b5556SXylle * Used for testing purposes. 9*d10b5556SXylle * 10*d10b5556SXylle * It records all records and gives you access to them for verification. 11*d10b5556SXylle * 12*d10b5556SXylle * @method bool hasEmergency($record) 13*d10b5556SXylle * @method bool hasAlert($record) 14*d10b5556SXylle * @method bool hasCritical($record) 15*d10b5556SXylle * @method bool hasError($record) 16*d10b5556SXylle * @method bool hasWarning($record) 17*d10b5556SXylle * @method bool hasNotice($record) 18*d10b5556SXylle * @method bool hasInfo($record) 19*d10b5556SXylle * @method bool hasDebug($record) 20*d10b5556SXylle * 21*d10b5556SXylle * @method bool hasEmergencyRecords() 22*d10b5556SXylle * @method bool hasAlertRecords() 23*d10b5556SXylle * @method bool hasCriticalRecords() 24*d10b5556SXylle * @method bool hasErrorRecords() 25*d10b5556SXylle * @method bool hasWarningRecords() 26*d10b5556SXylle * @method bool hasNoticeRecords() 27*d10b5556SXylle * @method bool hasInfoRecords() 28*d10b5556SXylle * @method bool hasDebugRecords() 29*d10b5556SXylle * 30*d10b5556SXylle * @method bool hasEmergencyThatContains($message) 31*d10b5556SXylle * @method bool hasAlertThatContains($message) 32*d10b5556SXylle * @method bool hasCriticalThatContains($message) 33*d10b5556SXylle * @method bool hasErrorThatContains($message) 34*d10b5556SXylle * @method bool hasWarningThatContains($message) 35*d10b5556SXylle * @method bool hasNoticeThatContains($message) 36*d10b5556SXylle * @method bool hasInfoThatContains($message) 37*d10b5556SXylle * @method bool hasDebugThatContains($message) 38*d10b5556SXylle * 39*d10b5556SXylle * @method bool hasEmergencyThatMatches($message) 40*d10b5556SXylle * @method bool hasAlertThatMatches($message) 41*d10b5556SXylle * @method bool hasCriticalThatMatches($message) 42*d10b5556SXylle * @method bool hasErrorThatMatches($message) 43*d10b5556SXylle * @method bool hasWarningThatMatches($message) 44*d10b5556SXylle * @method bool hasNoticeThatMatches($message) 45*d10b5556SXylle * @method bool hasInfoThatMatches($message) 46*d10b5556SXylle * @method bool hasDebugThatMatches($message) 47*d10b5556SXylle * 48*d10b5556SXylle * @method bool hasEmergencyThatPasses($message) 49*d10b5556SXylle * @method bool hasAlertThatPasses($message) 50*d10b5556SXylle * @method bool hasCriticalThatPasses($message) 51*d10b5556SXylle * @method bool hasErrorThatPasses($message) 52*d10b5556SXylle * @method bool hasWarningThatPasses($message) 53*d10b5556SXylle * @method bool hasNoticeThatPasses($message) 54*d10b5556SXylle * @method bool hasInfoThatPasses($message) 55*d10b5556SXylle * @method bool hasDebugThatPasses($message) 56*d10b5556SXylle */ 57*d10b5556SXylleclass TestLogger extends AbstractLogger 58*d10b5556SXylle{ 59*d10b5556SXylle /** 60*d10b5556SXylle * @var array 61*d10b5556SXylle */ 62*d10b5556SXylle public $records = []; 63*d10b5556SXylle 64*d10b5556SXylle public $recordsByLevel = []; 65*d10b5556SXylle 66*d10b5556SXylle /** 67*d10b5556SXylle * @inheritdoc 68*d10b5556SXylle */ 69*d10b5556SXylle public function log($level, $message, array $context = []) 70*d10b5556SXylle { 71*d10b5556SXylle $record = [ 72*d10b5556SXylle 'level' => $level, 73*d10b5556SXylle 'message' => $message, 74*d10b5556SXylle 'context' => $context, 75*d10b5556SXylle ]; 76*d10b5556SXylle 77*d10b5556SXylle $this->recordsByLevel[$record['level']][] = $record; 78*d10b5556SXylle $this->records[] = $record; 79*d10b5556SXylle } 80*d10b5556SXylle 81*d10b5556SXylle public function hasRecords($level) 82*d10b5556SXylle { 83*d10b5556SXylle return isset($this->recordsByLevel[$level]); 84*d10b5556SXylle } 85*d10b5556SXylle 86*d10b5556SXylle public function hasRecord($record, $level) 87*d10b5556SXylle { 88*d10b5556SXylle if (is_string($record)) { 89*d10b5556SXylle $record = ['message' => $record]; 90*d10b5556SXylle } 91*d10b5556SXylle return $this->hasRecordThatPasses(function ($rec) use ($record) { 92*d10b5556SXylle if ($rec['message'] !== $record['message']) { 93*d10b5556SXylle return false; 94*d10b5556SXylle } 95*d10b5556SXylle if (isset($record['context']) && $rec['context'] !== $record['context']) { 96*d10b5556SXylle return false; 97*d10b5556SXylle } 98*d10b5556SXylle return true; 99*d10b5556SXylle }, $level); 100*d10b5556SXylle } 101*d10b5556SXylle 102*d10b5556SXylle public function hasRecordThatContains($message, $level) 103*d10b5556SXylle { 104*d10b5556SXylle return $this->hasRecordThatPasses(function ($rec) use ($message) { 105*d10b5556SXylle return strpos($rec['message'], $message) !== false; 106*d10b5556SXylle }, $level); 107*d10b5556SXylle } 108*d10b5556SXylle 109*d10b5556SXylle public function hasRecordThatMatches($regex, $level) 110*d10b5556SXylle { 111*d10b5556SXylle return $this->hasRecordThatPasses(function ($rec) use ($regex) { 112*d10b5556SXylle return preg_match($regex, $rec['message']) > 0; 113*d10b5556SXylle }, $level); 114*d10b5556SXylle } 115*d10b5556SXylle 116*d10b5556SXylle public function hasRecordThatPasses(callable $predicate, $level) 117*d10b5556SXylle { 118*d10b5556SXylle if (!isset($this->recordsByLevel[$level])) { 119*d10b5556SXylle return false; 120*d10b5556SXylle } 121*d10b5556SXylle foreach ($this->recordsByLevel[$level] as $i => $rec) { 122*d10b5556SXylle if (call_user_func($predicate, $rec, $i)) { 123*d10b5556SXylle return true; 124*d10b5556SXylle } 125*d10b5556SXylle } 126*d10b5556SXylle return false; 127*d10b5556SXylle } 128*d10b5556SXylle 129*d10b5556SXylle public function __call($method, $args) 130*d10b5556SXylle { 131*d10b5556SXylle if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { 132*d10b5556SXylle $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; 133*d10b5556SXylle $level = strtolower($matches[2]); 134*d10b5556SXylle if (method_exists($this, $genericMethod)) { 135*d10b5556SXylle $args[] = $level; 136*d10b5556SXylle return call_user_func_array([$this, $genericMethod], $args); 137*d10b5556SXylle } 138*d10b5556SXylle } 139*d10b5556SXylle throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); 140*d10b5556SXylle } 141*d10b5556SXylle 142*d10b5556SXylle public function reset() 143*d10b5556SXylle { 144*d10b5556SXylle $this->records = []; 145*d10b5556SXylle $this->recordsByLevel = []; 146*d10b5556SXylle } 147*d10b5556SXylle} 148