Skip to content

Commit

Permalink
Allow psr/log 2 and 3
Browse files Browse the repository at this point in the history
  • Loading branch information
asgrim committed Oct 21, 2021
1 parent bc001ca commit 69f3fd4
Show file tree
Hide file tree
Showing 7 changed files with 185 additions and 14 deletions.
3 changes: 1 addition & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"ext-openssl": "*",
"ext-sockets": "*",
"ext-zlib": "*",
"psr/log": "^1.0",
"psr/log": "^1.0|^2.0|^3.0",
"psr/simple-cache": "^1.0",
"ralouphie/getallheaders": "^2.0.5|^3.0",
"ramsey/uuid": "^3.0|^4.0",
Expand All @@ -26,7 +26,6 @@
"monolog/monolog": "^1.26|^2.2.0",
"phpunit/phpunit": "^7.5.20|^8.5.14|^9.5.2",
"psalm/plugin-phpunit": "^0.15.1",
"psr/log": "^1.1",
"symfony/config": "^4.0 || ^5.0",
"symfony/dependency-injection": "^4.0 || ^5.0",
"symfony/event-dispatcher": "^4.0 || ^5.0",
Expand Down
16 changes: 8 additions & 8 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion tests/Integration/AgentTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@
use MongoDB\Driver\Manager;
use MongoDB\Driver\Query;
use PHPUnit\Framework\TestCase;
use Psr\Log\Test\TestLogger;
use Scoutapm\Agent;
use Scoutapm\Config;
use Scoutapm\Config\ConfigKey;
use Scoutapm\Connector\ConnectionAddress;
use Scoutapm\Connector\SocketConnector;
use Scoutapm\Events\Span\SpanReference;
use Scoutapm\Extension\PotentiallyAvailableExtensionCapabilities;
use Scoutapm\UnitTests\TestLogger;

use function assert;
use function extension_loaded;
Expand Down
1 change: 0 additions & 1 deletion tests/Unit/AgentTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\LogLevel;
use Psr\Log\Test\TestLogger;
use Scoutapm\Agent;
use Scoutapm\Cache\DevNullCache;
use Scoutapm\Config;
Expand Down
2 changes: 1 addition & 1 deletion tests/Unit/CoreAgent/LauncherTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
namespace Scoutapm\UnitTests\CoreAgent;

use PHPUnit\Framework\TestCase;
use Psr\Log\Test\TestLogger;
use Scoutapm\Config;
use Scoutapm\Connector\ConnectionAddress;
use Scoutapm\CoreAgent\Launcher;
use Scoutapm\UnitTests\TestLogger;

/** @covers \Scoutapm\CoreAgent\Launcher */
final class LauncherTest extends TestCase
Expand Down
173 changes: 173 additions & 0 deletions tests/Unit/TestLogger.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
<?php

declare(strict_types=1);

namespace Scoutapm\UnitTests;

use BadMethodCallException;
use Psr\Log\AbstractLogger;

use function call_user_func_array;
use function is_string;
use function method_exists;
use function preg_match;
use function strpos;
use function strtolower;

/**
* Used for testing purposes.
*
* It records all records and gives you access to them for verification.
*
* @method bool hasEmergency($record)
* @method bool hasAlert($record)
* @method bool hasCritical($record)
* @method bool hasError($record)
* @method bool hasWarning($record)
* @method bool hasNotice($record)
* @method bool hasInfo($record)
* @method bool hasDebug($record)
* @method bool hasEmergencyRecords()
* @method bool hasAlertRecords()
* @method bool hasCriticalRecords()
* @method bool hasErrorRecords()
* @method bool hasWarningRecords()
* @method bool hasNoticeRecords()
* @method bool hasInfoRecords()
* @method bool hasDebugRecords()
* @method bool hasEmergencyThatContains($message)
* @method bool hasAlertThatContains($message)
* @method bool hasCriticalThatContains($message)
* @method bool hasErrorThatContains($message)
* @method bool hasWarningThatContains($message)
* @method bool hasNoticeThatContains($message)
* @method bool hasInfoThatContains($message)
* @method bool hasDebugThatContains($message)
* @method bool hasEmergencyThatMatches($message)
* @method bool hasAlertThatMatches($message)
* @method bool hasCriticalThatMatches($message)
* @method bool hasErrorThatMatches($message)
* @method bool hasWarningThatMatches($message)
* @method bool hasNoticeThatMatches($message)
* @method bool hasInfoThatMatches($message)
* @method bool hasDebugThatMatches($message)
* @method bool hasEmergencyThatPasses($message)
* @method bool hasAlertThatPasses($message)
* @method bool hasCriticalThatPasses($message)
* @method bool hasErrorThatPasses($message)
* @method bool hasWarningThatPasses($message)
* @method bool hasNoticeThatPasses($message)
* @method bool hasInfoThatPasses($message)
* @method bool hasDebugThatPasses($message)
* @psalm-type LogRecord = array{level: string, message: string, context: array}
*/
class TestLogger extends AbstractLogger
{
/** @psalm-var list<LogRecord> */
public $records = [];

/** @psalm-var array<string,list<LogRecord>> */
public $recordsByLevel = [];

/**
* @inheritdoc
*/
public function log($level, $message, array $context = [])
{
$record = [
'level' => (string) $level,
'message' => $message,
'context' => $context,
];

$this->recordsByLevel[$record['level']][] = $record;
$this->records[] = $record;
}

public function hasRecords(string $level): bool
{
return isset($this->recordsByLevel[$level]);
}

/**
* @param string|array{message:string, context?: mixed} $record
*/
public function hasRecord($record, string $level): bool
{
if (is_string($record)) {
$record = ['message' => $record];
}

return $this->hasRecordThatPasses(
/** @psalm-param LogRecord $rec */
static function ($rec) use ($record): bool {
if ($rec['message'] !== $record['message']) {
return false;
}

return ! isset($record['context']) || $rec['context'] === $record['context'];
},
$level
);
}

public function hasRecordThatContains(string $message, string $level): bool
{
return $this->hasRecordThatPasses(
/** @psalm-param LogRecord $rec */
static function ($rec) use ($message): bool {
return strpos($rec['message'], $message) !== false;
},
$level
);
}

public function hasRecordThatMatches(string $regex, string $level): bool
{
return $this->hasRecordThatPasses(
/** @psalm-param LogRecord $rec */
static function ($rec) use ($regex): bool {
return preg_match($regex, $rec['message']) > 0;
},
$level
);
}

/** @psalm-param callable(LogRecord):bool $predicate */
public function hasRecordThatPasses(callable $predicate, string $level): bool
{
if (! isset($this->recordsByLevel[$level])) {
return false;
}

foreach ($this->recordsByLevel[$level] as $rec) {
if ($predicate($rec)) {
return true;
}
}

return false;
}

/** @param array<array-key, mixed> $args */
public function __call(string $method, array $args): bool
{
if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) {
$genericMethod = $matches[1] . ($matches[3] !== 'Records' ? 'Record' : '') . $matches[3];
$level = strtolower($matches[2]);
if (method_exists($this, $genericMethod)) {
$args[] = $level;

return (bool) call_user_func_array([$this, $genericMethod], $args);
}
}

throw new BadMethodCallException('Call to undefined method ' . static::class . '::' . $method . '()');
}

public function reset(): void
{
$this->records = [];
$this->recordsByLevel = [];
}
}
2 changes: 1 addition & 1 deletion tests/isolated-memory-test.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

declare(strict_types=1);

use Psr\Log\Test\TestLogger;
use Scoutapm\Agent;
use Scoutapm\Config;
use Scoutapm\Events\Span\SpanReference;
use Scoutapm\Extension\PotentiallyAvailableExtensionCapabilities;
use Scoutapm\UnitTests\TestLogger;

require __DIR__ . '/../vendor/autoload.php';

Expand Down

0 comments on commit 69f3fd4

Please sign in to comment.