Skip to content
Merged
64 changes: 44 additions & 20 deletions tests/framework/BaseYiiTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -172,27 +172,51 @@ public function testLog(): void

BaseYii::setLogger($logger);

$logger->expects($this->exactly(6))
/**
* @link https://github.com/sebastianbergmann/phpunit/issues/5063
*/
$matcher = $this->exactly(6);
$logger
->expects($matcher)
->method('log')
->withConsecutive(
[$this->equalTo('info message'), $this->equalTo(Logger::LEVEL_INFO), $this->equalTo('info category')],
[
$this->equalTo('warning message'),
$this->equalTo(Logger::LEVEL_WARNING),
$this->equalTo('warning category'),
],
[$this->equalTo('trace message'), $this->equalTo(Logger::LEVEL_TRACE), $this->equalTo('trace category')],
[$this->equalTo('error message'), $this->equalTo(Logger::LEVEL_ERROR), $this->equalTo('error category')],
[
$this->equalTo('beginProfile message'),
$this->equalTo(Logger::LEVEL_PROFILE_BEGIN),
$this->equalTo('beginProfile category'),
],
[
$this->equalTo('endProfile message'),
$this->equalTo(Logger::LEVEL_PROFILE_END),
$this->equalTo('endProfile category'),
]
->willReturnCallback(
function (...$parameters) use ($matcher): void {
if ($matcher->getInvocationCount() === 1) {
$this->assertEquals('info message', $parameters[0]);
$this->assertEquals(Logger::LEVEL_INFO, $parameters[1]);
$this->assertEquals('info category', $parameters[2]);
}

if ($matcher->getInvocationCount() === 2) {
$this->assertEquals('warning message', $parameters[0]);
$this->assertEquals(Logger::LEVEL_WARNING, $parameters[1]);
$this->assertEquals('warning category', $parameters[2]);
}

if ($matcher->getInvocationCount() === 3) {
$this->assertEquals('trace message', $parameters[0]);
$this->assertEquals(Logger::LEVEL_TRACE, $parameters[1]);
$this->assertEquals('trace category', $parameters[2]);
}

if ($matcher->getInvocationCount() === 4) {
$this->assertEquals('error message', $parameters[0]);
$this->assertEquals(Logger::LEVEL_ERROR, $parameters[1]);
$this->assertEquals('error category', $parameters[2]);
}

if ($matcher->getInvocationCount() === 5) {
$this->assertEquals('beginProfile message', $parameters[0]);
$this->assertEquals(Logger::LEVEL_PROFILE_BEGIN, $parameters[1]);
$this->assertEquals('beginProfile category', $parameters[2]);
}

if ($matcher->getInvocationCount() === 6) {
$this->assertEquals('endProfile message', $parameters[0]);
$this->assertEquals(Logger::LEVEL_PROFILE_END, $parameters[1]);
$this->assertEquals('endProfile category', $parameters[2]);
}
},
);

BaseYii::info('info message', 'info category');
Expand Down
87 changes: 54 additions & 33 deletions tests/framework/log/DispatcherTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -187,43 +187,64 @@ public function testDispatchWithSuccessTargetCollect(): void
public function testDispatchWithFakeTarget2ThrowExceptionWhenCollect(): void
{
static::$microtimeIsMocked = true;

$target1 = $this->createPartialMock(Target::class, ['collect', 'export']);
$target2 = $this->createPartialMock(Target::class, ['collect', 'export']);

$target1->expects($this->exactly(2))
/**
* @link https://github.com/sebastianbergmann/phpunit/issues/5063
*/
$matcher = $this->exactly(2);
$target1
->expects($matcher)
->method('collect')
->withConsecutive(
[$this->equalTo('messages'), $this->equalTo(true)],
[
$this->callback(function ($arg) use ($target1) {
if (!isset($arg[0][0], $arg[0][1], $arg[0][2], $arg[0][3])) {
return false;
}

if (strpos($arg[0][0], 'Unable to send log via ' . get_class($target1) . ': Exception (Exception) \'yii\base\UserException\' with message \'some error\'') !== 0) {
return false;
}

if ($arg[0][1] !== Logger::LEVEL_WARNING) {
return false;
}

if ($arg[0][2] !== 'yii\log\Dispatcher::dispatch') {
return false;
}

if ($arg[0][3] !== 'time data') {
return false;
}

if ($arg[0][4] !== []) {
return false;
}

return true;
}),
true,
]
->willReturnCallback(
function (...$parameters) use ($matcher): void {
if ($matcher->getInvocationCount() === 1) {
$this->assertEquals('messages', $parameters[0]);
$this->assertTrue($parameters[1]);
}

if ($matcher->getInvocationCount() === 2) {
$callback = function ($arg) use ($target1): bool {
if (!isset($arg[0][0], $arg[0][1], $arg[0][2], $arg[0][3])) {
return false;
}

if (
!str_starts_with(
(string) $arg[0][0],
'Unable to send log via ' .
get_class($target1) .
': Exception (Exception) \'yii\base\UserException\' with message \'some error\''
)
) {
return false;
}

if ($arg[0][1] !== Logger::LEVEL_WARNING) {
return false;
}

if ($arg[0][2] !== 'yii\log\Dispatcher::dispatch') {
return false;
}

if ($arg[0][3] !== 'time data') {
return false;
}

if ($arg[0][4] !== []) {
return false;
}

return true;
};

$this->assertTrue($callback($parameters[0]));
$this->assertTrue($parameters[1]);
}
},
);

$target2->expects($this->once())
Expand Down
52 changes: 43 additions & 9 deletions tests/framework/log/SyslogTargetTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -114,16 +114,50 @@ public function testExport(): void
[$messages[6], 'formatted message 7'],
]);

$syslogTarget->expects($this->exactly(7))
/**
* @link https://github.com/sebastianbergmann/phpunit/issues/5063
*/
$matcher = $this->exactly(7);
$syslogTarget
->expects($matcher)
->method('syslog')
->withConsecutive(
[$this->equalTo(LOG_INFO), $this->equalTo('formatted message 1')],
[$this->equalTo(LOG_ERR), $this->equalTo('formatted message 2')],
[$this->equalTo(LOG_WARNING), $this->equalTo('formatted message 3')],
[$this->equalTo(LOG_DEBUG), $this->equalTo('formatted message 4')],
[$this->equalTo(LOG_DEBUG), $this->equalTo('formatted message 5')],
[$this->equalTo(LOG_DEBUG), $this->equalTo('formatted message 6')],
[$this->equalTo(LOG_DEBUG), $this->equalTo('formatted message 7')]
->willReturnCallback(
function (...$parameters) use ($matcher): void {
if ($matcher->getInvocationCount() === 1) {
$this->assertEquals(LOG_INFO, $parameters[0]);
$this->assertEquals('formatted message 1', $parameters[1]);
}

if ($matcher->getInvocationCount() === 2) {
$this->assertEquals(LOG_ERR, $parameters[0]);
$this->assertEquals('formatted message 2', $parameters[1]);
}

if ($matcher->getInvocationCount() === 3) {
$this->assertEquals(LOG_WARNING, $parameters[0]);
$this->assertEquals('formatted message 3', $parameters[1]);
}

if ($matcher->getInvocationCount() === 4) {
$this->assertEquals(LOG_DEBUG, $parameters[0]);
$this->assertEquals('formatted message 4', $parameters[1]);
}

if ($matcher->getInvocationCount() === 5) {
$this->assertEquals(LOG_DEBUG, $parameters[0]);
$this->assertEquals('formatted message 5', $parameters[1]);
}

if ($matcher->getInvocationCount() === 6) {
$this->assertEquals(LOG_DEBUG, $parameters[0]);
$this->assertEquals('formatted message 6', $parameters[1]);
}

if ($matcher->getInvocationCount() === 7) {
$this->assertEquals(LOG_DEBUG, $parameters[0]);
$this->assertEquals('formatted message 7', $parameters[1]);
}
}
);

$syslogTarget->expects($this->once())->method('closelog');
Expand Down
121 changes: 72 additions & 49 deletions tests/framework/log/TargetTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -265,25 +265,36 @@ public function testBreakProfilingWithFlushWithProfilingDisabled(): void

public function testNotBreakProfilingWithFlushWithProfilingEnabled(): void
{
$dispatcher = $this->createPartialMock('yii\log\Dispatcher', ['dispatch']);
$dispatcher->expects($this->exactly(2))->method('dispatch')->withConsecutive(
[
$this->callback(function ($messages) {
return count($messages) === 1 && $messages[0][0] === 'info';
}),
false
],
[
$this->callback(function ($messages) {
return count($messages) === 2
&& $messages[0][0] === 'token.a'
&& $messages[0][1] == Logger::LEVEL_PROFILE_BEGIN
&& $messages[1][0] === 'token.a'
&& $messages[1][1] == Logger::LEVEL_PROFILE_END;
}),
false
]
);
$dispatcher = $this->createPartialMock(Dispatcher::class, ['dispatch']);

/**
* @link https://github.com/sebastianbergmann/phpunit/issues/5063
*/
$matcher = $this->exactly(2);
$dispatcher
->expects($matcher)
->method('dispatch')
->willReturnCallback(
function (...$parameters) use ($matcher): void {
if ($matcher->getInvocationCount() === 1) {
$callback = fn($messages): bool => count($messages) === 1 && $messages[0][0] === 'info';

$this->assertTrue($callback($parameters[0]));
$this->assertFalse($parameters[1]);
}

if ($matcher->getInvocationCount() === 2) {
$callback = fn($messages): bool => count($messages) === 2
&& $messages[0][0] === 'token.a'
&& $messages[0][1] === Logger::LEVEL_PROFILE_BEGIN
&& $messages[1][0] === 'token.a'
&& $messages[1][1] === Logger::LEVEL_PROFILE_END;

$this->assertTrue($callback($parameters[0]));
$this->assertFalse($parameters[1]);
}
},
);

$logger = new Logger([
'profilingAware' => true,
Expand All @@ -298,36 +309,48 @@ public function testNotBreakProfilingWithFlushWithProfilingEnabled(): void

public function testFlushingWithProfilingEnabledAndOverflow(): void
{
$dispatcher = $this->createPartialMock('yii\log\Dispatcher', ['dispatch']);
$dispatcher->expects($this->exactly(3))->method('dispatch')->withConsecutive(
[
$this->callback(function ($messages) {
return count($messages) === 2
&& $messages[0][0] === 'token.a'
&& $messages[0][1] == Logger::LEVEL_PROFILE_BEGIN
&& $messages[1][0] === 'token.b'
&& $messages[1][1] == Logger::LEVEL_PROFILE_BEGIN;
}),
false
],
[
$this->callback(function ($messages) {
return count($messages) === 1
&& $messages[0][0] === 'Number of dangling profiling block messages reached flushInterval value and therefore these were flushed. Please consider setting higher flushInterval value or making profiling blocks shorter.';
}),
false
],
[
$this->callback(function ($messages) {
return count($messages) === 2
&& $messages[0][0] === 'token.b'
&& $messages[0][1] == Logger::LEVEL_PROFILE_END
&& $messages[1][0] === 'token.a'
&& $messages[1][1] == Logger::LEVEL_PROFILE_END;
}),
false
]
);
$dispatcher = $this->createPartialMock(Dispatcher::class, ['dispatch']);

/**
* @link https://github.com/sebastianbergmann/phpunit/issues/5063
*/
$matcher = $this->exactly(3);
$dispatcher
->expects($matcher)
->method('dispatch')
->willReturnCallback(
function (...$parameters) use ($matcher): void {
if ($matcher->getInvocationCount() === 1) {
$callback = fn($messages): bool => count($messages) === 2
&& $messages[0][0] === 'token.a'
&& $messages[0][1] === Logger::LEVEL_PROFILE_BEGIN
&& $messages[1][0] === 'token.b'
&& $messages[1][1] === Logger::LEVEL_PROFILE_BEGIN;

$this->assertTrue($callback($parameters[0]));
$this->assertFalse($parameters[1]);
}

if ($matcher->getInvocationCount() === 2) {
$callback = fn($messages): bool => count($messages) === 1
&& $messages[0][0] === 'Number of dangling profiling block messages reached flushInterval value and therefore these were flushed. Please consider setting higher flushInterval value or making profiling blocks shorter.';

$this->assertTrue($callback($parameters[0]));
$this->assertFalse($parameters[1]);
}

if ($matcher->getInvocationCount() === 3) {
$callback = fn($messages): bool => count($messages) === 2
&& $messages[0][0] === 'token.b'
&& $messages[0][1] === Logger::LEVEL_PROFILE_END
&& $messages[1][0] === 'token.a'
&& $messages[1][1] === Logger::LEVEL_PROFILE_END;

$this->assertTrue($callback($parameters[0]));
$this->assertFalse($parameters[1]);
}
},
);

$logger = new Logger([
'profilingAware' => true,
Expand Down
Loading