diff --git a/.github/workflows/phpunit-bridge.yml b/.github/workflows/phpunit-bridge.yml index fd169dfae782..ef6b86be43e0 100644 --- a/.github/workflows/phpunit-bridge.yml +++ b/.github/workflows/phpunit-bridge.yml @@ -35,4 +35,4 @@ jobs: php-version: "7.2" - name: Lint - run: find ./src/Symfony/Bridge/PhpUnit -name '*.php' | grep -v -e /Tests/ -e ForV7 -e ForV8 -e ForV9 -e ConstraintLogicTrait | parallel -j 4 php -l {} + run: find ./src/Symfony/Bridge/PhpUnit -name '*.php' | grep -v -e /Tests/ -e /Attribute/ -e /Extension/ -e /Metadata/ -e ForV7 -e ForV8 -e ForV9 -e ConstraintLogicTrait | parallel -j 4 php -l {} diff --git a/src/Symfony/Bridge/PhpUnit/Attribute/DnsSensitive.php b/src/Symfony/Bridge/PhpUnit/Attribute/DnsSensitive.php new file mode 100644 index 000000000000..4c80ec5e2b8a --- /dev/null +++ b/src/Symfony/Bridge/PhpUnit/Attribute/DnsSensitive.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\PhpUnit\Attribute; + +#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)] +final class DnsSensitive +{ + public function __construct( + public readonly ?string $class = null, + ) { + } +} diff --git a/src/Symfony/Bridge/PhpUnit/Attribute/TimeSensitive.php b/src/Symfony/Bridge/PhpUnit/Attribute/TimeSensitive.php new file mode 100644 index 000000000000..da9e816a7507 --- /dev/null +++ b/src/Symfony/Bridge/PhpUnit/Attribute/TimeSensitive.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\PhpUnit\Attribute; + +#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)] +final class TimeSensitive +{ + public function __construct( + public readonly ?string $class = null, + ) { + } +} diff --git a/src/Symfony/Bridge/PhpUnit/CHANGELOG.md b/src/Symfony/Bridge/PhpUnit/CHANGELOG.md index 3c747025792f..dd7b418c858d 100644 --- a/src/Symfony/Bridge/PhpUnit/CHANGELOG.md +++ b/src/Symfony/Bridge/PhpUnit/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +7.3 +--- + + * Enable configuring clock and DNS mock namespaces with attributes + 7.2 --- diff --git a/src/Symfony/Bridge/PhpUnit/Extension/DisableClockMockSubscriber.php b/src/Symfony/Bridge/PhpUnit/Extension/DisableClockMockSubscriber.php index 885e6ea585e5..1de94db29265 100644 --- a/src/Symfony/Bridge/PhpUnit/Extension/DisableClockMockSubscriber.php +++ b/src/Symfony/Bridge/PhpUnit/Extension/DisableClockMockSubscriber.php @@ -15,13 +15,20 @@ use PHPUnit\Event\Test\Finished; use PHPUnit\Event\Test\FinishedSubscriber; use PHPUnit\Metadata\Group; +use Symfony\Bridge\PhpUnit\Attribute\TimeSensitive; use Symfony\Bridge\PhpUnit\ClockMock; +use Symfony\Bridge\PhpUnit\Metadata\AttributeReader; /** * @internal */ class DisableClockMockSubscriber implements FinishedSubscriber { + public function __construct( + private AttributeReader $reader, + ) { + } + public function notify(Finished $event): void { $test = $event->test(); @@ -33,7 +40,12 @@ public function notify(Finished $event): void foreach ($test->metadata() as $metadata) { if ($metadata instanceof Group && 'time-sensitive' === $metadata->groupName()) { ClockMock::withClockMock(false); + break; } } + + if ($this->reader->forClassAndMethod($test->className(), $test->methodName(), TimeSensitive::class)) { + ClockMock::withClockMock(false); + } } } diff --git a/src/Symfony/Bridge/PhpUnit/Extension/DisableDnsMockSubscriber.php b/src/Symfony/Bridge/PhpUnit/Extension/DisableDnsMockSubscriber.php index fc3e754d140d..29cdbbf1835c 100644 --- a/src/Symfony/Bridge/PhpUnit/Extension/DisableDnsMockSubscriber.php +++ b/src/Symfony/Bridge/PhpUnit/Extension/DisableDnsMockSubscriber.php @@ -15,13 +15,20 @@ use PHPUnit\Event\Test\Finished; use PHPUnit\Event\Test\FinishedSubscriber; use PHPUnit\Metadata\Group; +use Symfony\Bridge\PhpUnit\Attribute\DnsSensitive; use Symfony\Bridge\PhpUnit\DnsMock; +use Symfony\Bridge\PhpUnit\Metadata\AttributeReader; /** * @internal */ class DisableDnsMockSubscriber implements FinishedSubscriber { + public function __construct( + private AttributeReader $reader, + ) { + } + public function notify(Finished $event): void { $test = $event->test(); @@ -33,7 +40,12 @@ public function notify(Finished $event): void foreach ($test->metadata() as $metadata) { if ($metadata instanceof Group && 'dns-sensitive' === $metadata->groupName()) { DnsMock::withMockedHosts([]); + break; } } + + if ($this->reader->forClassAndMethod($test->className(), $test->methodName(), DnsSensitive::class)) { + DnsMock::withMockedHosts([]); + } } } diff --git a/src/Symfony/Bridge/PhpUnit/Extension/EnableClockMockSubscriber.php b/src/Symfony/Bridge/PhpUnit/Extension/EnableClockMockSubscriber.php index c10c5dcd18cd..b3d563340bcb 100644 --- a/src/Symfony/Bridge/PhpUnit/Extension/EnableClockMockSubscriber.php +++ b/src/Symfony/Bridge/PhpUnit/Extension/EnableClockMockSubscriber.php @@ -15,13 +15,20 @@ use PHPUnit\Event\Test\PreparationStarted; use PHPUnit\Event\Test\PreparationStartedSubscriber; use PHPUnit\Metadata\Group; +use Symfony\Bridge\PhpUnit\Attribute\TimeSensitive; use Symfony\Bridge\PhpUnit\ClockMock; +use Symfony\Bridge\PhpUnit\Metadata\AttributeReader; /** * @internal */ class EnableClockMockSubscriber implements PreparationStartedSubscriber { + public function __construct( + private AttributeReader $reader, + ) { + } + public function notify(PreparationStarted $event): void { $test = $event->test(); @@ -33,7 +40,12 @@ public function notify(PreparationStarted $event): void foreach ($test->metadata() as $metadata) { if ($metadata instanceof Group && 'time-sensitive' === $metadata->groupName()) { ClockMock::withClockMock(true); + break; } } + + if ($this->reader->forClassAndMethod($test->className(), $test->methodName(), TimeSensitive::class)) { + ClockMock::withClockMock(true); + } } } diff --git a/src/Symfony/Bridge/PhpUnit/Extension/RegisterClockMockSubscriber.php b/src/Symfony/Bridge/PhpUnit/Extension/RegisterClockMockSubscriber.php index e2955fe6003e..b89f16404ff1 100644 --- a/src/Symfony/Bridge/PhpUnit/Extension/RegisterClockMockSubscriber.php +++ b/src/Symfony/Bridge/PhpUnit/Extension/RegisterClockMockSubscriber.php @@ -15,13 +15,20 @@ use PHPUnit\Event\TestSuite\Loaded; use PHPUnit\Event\TestSuite\LoadedSubscriber; use PHPUnit\Metadata\Group; +use Symfony\Bridge\PhpUnit\Attribute\TimeSensitive; use Symfony\Bridge\PhpUnit\ClockMock; +use Symfony\Bridge\PhpUnit\Metadata\AttributeReader; /** * @internal */ class RegisterClockMockSubscriber implements LoadedSubscriber { + public function __construct( + private AttributeReader $reader, + ) { + } + public function notify(Loaded $event): void { foreach ($event->testSuite()->tests() as $test) { @@ -34,6 +41,10 @@ public function notify(Loaded $event): void ClockMock::register($test->className()); } } + + foreach ($this->reader->forClassAndMethod($test->className(), $test->methodName(), TimeSensitive::class) as $attribute) { + ClockMock::register($attribute->class ?? $test->className()); + } } } } diff --git a/src/Symfony/Bridge/PhpUnit/Extension/RegisterDnsMockSubscriber.php b/src/Symfony/Bridge/PhpUnit/Extension/RegisterDnsMockSubscriber.php index 81382d5e13b4..80e9a3371f5c 100644 --- a/src/Symfony/Bridge/PhpUnit/Extension/RegisterDnsMockSubscriber.php +++ b/src/Symfony/Bridge/PhpUnit/Extension/RegisterDnsMockSubscriber.php @@ -15,13 +15,20 @@ use PHPUnit\Event\TestSuite\Loaded; use PHPUnit\Event\TestSuite\LoadedSubscriber; use PHPUnit\Metadata\Group; +use Symfony\Bridge\PhpUnit\Attribute\DnsSensitive; use Symfony\Bridge\PhpUnit\DnsMock; +use Symfony\Bridge\PhpUnit\Metadata\AttributeReader; /** * @internal */ class RegisterDnsMockSubscriber implements LoadedSubscriber { + public function __construct( + private AttributeReader $reader, + ) { + } + public function notify(Loaded $event): void { foreach ($event->testSuite()->tests() as $test) { @@ -34,6 +41,10 @@ public function notify(Loaded $event): void DnsMock::register($test->className()); } } + + foreach ($this->reader->forClassAndMethod($test->className(), $test->methodName(), DnsSensitive::class) as $attribute) { + DnsMock::register($attribute->class ?? $test->className()); + } } } } diff --git a/src/Symfony/Bridge/PhpUnit/Metadata/AttributeReader.php b/src/Symfony/Bridge/PhpUnit/Metadata/AttributeReader.php new file mode 100644 index 000000000000..37f592a65824 --- /dev/null +++ b/src/Symfony/Bridge/PhpUnit/Metadata/AttributeReader.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\PhpUnit\Metadata; + +/** + * @template T of object + */ +final class AttributeReader +{ + /** + * @var array, list>> + */ + private array $cache = []; + + /** + * @param class-string $className + * @param class-string $name + * + * @return list + */ + public function forClass(string $className, string $name): array + { + $attributes = $this->cache[$className] ??= $this->readAttributes(new \ReflectionClass($className)); + + return $attributes[$name] ?? []; + } + + /** + * @param class-string $className + * @param class-string $name + * + * @return list + */ + public function forMethod(string $className, string $methodName, string $name): array + { + $attributes = $this->cache[$className.'::'.$methodName] ??= $this->readAttributes(new \ReflectionMethod($className, $methodName)); + + return $attributes[$name] ?? []; + } + + /** + * @param class-string $className + * @param class-string $name + * + * @return list + */ + public function forClassAndMethod(string $className, string $methodName, string $name): array + { + return [ + ...$this->forClass($className, $name), + ...$this->forMethod($className, $methodName, $name), + ]; + } + + private function readAttributes(\ReflectionClass|\ReflectionMethod $reflection): array + { + $attributeInstances = []; + + foreach ($reflection->getAttributes() as $attribute) { + if (!str_starts_with($name = $attribute->getName(), 'Symfony\\Bridge\\PhpUnit\\Attribute\\')) { + continue; + } + + $attributeInstances[$name][] = $attribute->newInstance(); + } + + return $attributeInstances; + } +} diff --git a/src/Symfony/Bridge/PhpUnit/SymfonyExtension.php b/src/Symfony/Bridge/PhpUnit/SymfonyExtension.php index 1df4f2065890..a21e4626368b 100644 --- a/src/Symfony/Bridge/PhpUnit/SymfonyExtension.php +++ b/src/Symfony/Bridge/PhpUnit/SymfonyExtension.php @@ -20,6 +20,7 @@ use Symfony\Bridge\PhpUnit\Extension\EnableClockMockSubscriber; use Symfony\Bridge\PhpUnit\Extension\RegisterClockMockSubscriber; use Symfony\Bridge\PhpUnit\Extension\RegisterDnsMockSubscriber; +use Symfony\Bridge\PhpUnit\Metadata\AttributeReader; use Symfony\Component\ErrorHandler\DebugClassLoader; class SymfonyExtension implements Extension @@ -30,15 +31,17 @@ public function bootstrap(Configuration $configuration, Facade $facade, Paramete DebugClassLoader::enable(); } + $reader = new AttributeReader(); + if ($parameters->has('clock-mock-namespaces')) { foreach (explode(',', $parameters->get('clock-mock-namespaces')) as $namespace) { ClockMock::register($namespace.'\DummyClass'); } } - $facade->registerSubscriber(new RegisterClockMockSubscriber()); - $facade->registerSubscriber(new EnableClockMockSubscriber()); - $facade->registerSubscriber(new DisableClockMockSubscriber()); + $facade->registerSubscriber(new RegisterClockMockSubscriber($reader)); + $facade->registerSubscriber(new EnableClockMockSubscriber($reader)); + $facade->registerSubscriber(new DisableClockMockSubscriber($reader)); if ($parameters->has('dns-mock-namespaces')) { foreach (explode(',', $parameters->get('dns-mock-namespaces')) as $namespace) { @@ -46,7 +49,7 @@ public function bootstrap(Configuration $configuration, Facade $facade, Paramete } } - $facade->registerSubscriber(new RegisterDnsMockSubscriber()); - $facade->registerSubscriber(new DisableDnsMockSubscriber()); + $facade->registerSubscriber(new RegisterDnsMockSubscriber($reader)); + $facade->registerSubscriber(new DisableDnsMockSubscriber($reader)); } } diff --git a/src/Symfony/Bridge/PhpUnit/Tests/Fixtures/symfonyextension/tests/bootstrap.php b/src/Symfony/Bridge/PhpUnit/Tests/Fixtures/symfonyextension/tests/bootstrap.php index 95dcc78ef026..3616e5096c3b 100644 --- a/src/Symfony/Bridge/PhpUnit/Tests/Fixtures/symfonyextension/tests/bootstrap.php +++ b/src/Symfony/Bridge/PhpUnit/Tests/Fixtures/symfonyextension/tests/bootstrap.php @@ -21,11 +21,14 @@ }); require __DIR__.'/../../../../SymfonyExtension.php'; +require __DIR__.'/../../../../Attribute/DnsSensitive.php'; +require __DIR__.'/../../../../Attribute/TimeSensitive.php'; require __DIR__.'/../../../../Extension/DisableClockMockSubscriber.php'; require __DIR__.'/../../../../Extension/DisableDnsMockSubscriber.php'; require __DIR__.'/../../../../Extension/EnableClockMockSubscriber.php'; require __DIR__.'/../../../../Extension/RegisterClockMockSubscriber.php'; require __DIR__.'/../../../../Extension/RegisterDnsMockSubscriber.php'; +require __DIR__.'/../../../../Metadata/AttributeReader.php'; if (file_exists(__DIR__.'/../../../../vendor/autoload.php')) { require __DIR__.'/../../../../vendor/autoload.php'; diff --git a/src/Symfony/Bridge/PhpUnit/Tests/Metadata/AttributeReaderTest.php b/src/Symfony/Bridge/PhpUnit/Tests/Metadata/AttributeReaderTest.php new file mode 100644 index 000000000000..351a62a41bcb --- /dev/null +++ b/src/Symfony/Bridge/PhpUnit/Tests/Metadata/AttributeReaderTest.php @@ -0,0 +1,96 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\PhpUnit\Tests\Metadata; + +use PHPUnit\Framework\TestCase; +use Symfony\Bridge\PhpUnit\Attribute\DnsSensitive; +use Symfony\Bridge\PhpUnit\Attribute\TimeSensitive; +use Symfony\Bridge\PhpUnit\Metadata\AttributeReader; +use Symfony\Bridge\PhpUnit\Tests\Metadata\Fixtures\FooBar; + +/** + * @requires PHP 8.0 + */ +final class AttributeReaderTest extends TestCase +{ + /** + * @dataProvider provideReadCases + */ + public function testAttributesAreRead(string $method, string $attributeClass, array $expected) + { + $reader = new AttributeReader(); + + $attributes = $reader->forClassAndMethod(FooBar::class, $method, $attributeClass); + + self::assertContainsOnlyInstancesOf($attributeClass, $attributes); + self::assertSame($expected, array_column($attributes, 'class')); + } + + public static function provideReadCases(): iterable + { + yield ['testOne', DnsSensitive::class, [ + 'App\Foo\Bar\A', + 'App\Foo\Bar\B', + 'App\Foo\Baz\C', + ]]; + yield ['testTwo', DnsSensitive::class, [ + 'App\Foo\Bar\A', + 'App\Foo\Bar\B', + ]]; + yield ['testThree', DnsSensitive::class, [ + 'App\Foo\Bar\A', + 'App\Foo\Bar\B', + 'App\Foo\Corge\F', + ]]; + + yield ['testOne', TimeSensitive::class, [ + 'App\Foo\Bar\A', + ]]; + yield ['testTwo', TimeSensitive::class, [ + 'App\Foo\Bar\A', + 'App\Foo\Qux\D', + 'App\Foo\Qux\E', + ]]; + yield ['testThree', TimeSensitive::class, [ + 'App\Foo\Bar\A', + 'App\Foo\Corge\G', + ]]; + } + + public function testAttributesAreCached() + { + $reader = new AttributeReader(); + $cacheRef = new \ReflectionProperty(AttributeReader::class, 'cache'); + + self::assertEmpty($cacheRef->getValue($reader)); + + $reader->forClass(FooBar::class, TimeSensitive::class); + + self::assertCount(1, $cache = $cacheRef->getValue($reader)); + self::assertArrayHasKey(FooBar::class, $cache); + self::assertAttributesCount($cache[FooBar::class], 2, 1); + + $reader->forMethod(FooBar::class, 'testThree', DnsSensitive::class); + + self::assertCount(2, $cache = $cacheRef->getValue($reader)); + self::assertArrayHasKey($key = FooBar::class.'::testThree', $cache); + self::assertAttributesCount($cache[$key], 1, 1); + } + + private static function assertAttributesCount(array $attributes, int $expectedDnsCount, int $expectedTimeCount): void + { + self::assertArrayHasKey(DnsSensitive::class, $attributes); + self::assertCount($expectedDnsCount, $attributes[DnsSensitive::class]); + self::assertArrayHasKey(TimeSensitive::class, $attributes); + self::assertCount($expectedTimeCount, $attributes[TimeSensitive::class]); + } +} diff --git a/src/Symfony/Bridge/PhpUnit/Tests/Metadata/Fixtures/FooBar.php b/src/Symfony/Bridge/PhpUnit/Tests/Metadata/Fixtures/FooBar.php new file mode 100644 index 000000000000..63b9d28d29e7 --- /dev/null +++ b/src/Symfony/Bridge/PhpUnit/Tests/Metadata/Fixtures/FooBar.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\PhpUnit\Tests\Metadata\Fixtures; + +use Symfony\Bridge\PhpUnit\Attribute\DnsSensitive; +use Symfony\Bridge\PhpUnit\Attribute\TimeSensitive; + +#[DnsSensitive('App\Foo\Bar\A')] +#[DnsSensitive('App\Foo\Bar\B')] +#[TimeSensitive('App\Foo\Bar\A')] +final class FooBar +{ + #[DnsSensitive('App\Foo\Baz\C')] + public function testOne() + { + } + + #[TimeSensitive('App\Foo\Qux\D')] + #[TimeSensitive('App\Foo\Qux\E')] + public function testTwo() + { + } + + #[DnsSensitive('App\Foo\Corge\F')] + #[TimeSensitive('App\Foo\Corge\G')] + public function testThree() + { + } +} diff --git a/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php b/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php index ac2d90757bba..1219c27be097 100644 --- a/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php +++ b/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php @@ -14,9 +14,13 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; +use Symfony\Bridge\PhpUnit\Attribute\DnsSensitive; +use Symfony\Bridge\PhpUnit\Attribute\TimeSensitive; use Symfony\Bridge\PhpUnit\Tests\Fixtures\symfonyextension\src\ClassExtendingFinalClass; use Symfony\Bridge\PhpUnit\Tests\Fixtures\symfonyextension\src\FinalClass; +#[DnsSensitive('App\Foo\A')] +#[TimeSensitive('App\Foo\A')] class SymfonyExtension extends TestCase { public function testExtensionOfFinalClass() @@ -28,6 +32,7 @@ public function testExtensionOfFinalClass() #[DataProvider('mockedNamespaces')] #[Group('time-sensitive')] + #[TimeSensitive('App\Bar\B')] public function testTimeMockIsRegistered(string $namespace) { $this->assertTrue(\function_exists(\sprintf('%s\time', $namespace))); @@ -35,6 +40,7 @@ public function testTimeMockIsRegistered(string $namespace) #[DataProvider('mockedNamespaces')] #[Group('time-sensitive')] + #[TimeSensitive('App\Bar\B')] public function testMicrotimeMockIsRegistered(string $namespace) { $this->assertTrue(\function_exists(\sprintf('%s\microtime', $namespace))); @@ -42,6 +48,7 @@ public function testMicrotimeMockIsRegistered(string $namespace) #[DataProvider('mockedNamespaces')] #[Group('time-sensitive')] + #[TimeSensitive('App\Bar\B')] public function testSleepMockIsRegistered(string $namespace) { $this->assertTrue(\function_exists(\sprintf('%s\sleep', $namespace))); @@ -49,6 +56,7 @@ public function testSleepMockIsRegistered(string $namespace) #[DataProvider('mockedNamespaces')] #[Group('time-sensitive')] + #[TimeSensitive('App\Bar\B')] public function testUsleepMockIsRegistered(string $namespace) { $this->assertTrue(\function_exists(\sprintf('%s\usleep', $namespace))); @@ -56,6 +64,7 @@ public function testUsleepMockIsRegistered(string $namespace) #[DataProvider('mockedNamespaces')] #[Group('time-sensitive')] + #[TimeSensitive('App\Bar\B')] public function testDateMockIsRegistered(string $namespace) { $this->assertTrue(\function_exists(\sprintf('%s\date', $namespace))); @@ -63,6 +72,7 @@ public function testDateMockIsRegistered(string $namespace) #[DataProvider('mockedNamespaces')] #[Group('time-sensitive')] + #[TimeSensitive('App\Bar\B')] public function testGmdateMockIsRegistered(string $namespace) { $this->assertTrue(\function_exists(\sprintf('%s\gmdate', $namespace))); @@ -70,6 +80,7 @@ public function testGmdateMockIsRegistered(string $namespace) #[DataProvider('mockedNamespaces')] #[Group('time-sensitive')] + #[TimeSensitive('App\Bar\B')] public function testHrtimeMockIsRegistered(string $namespace) { $this->assertTrue(\function_exists(\sprintf('%s\hrtime', $namespace))); @@ -77,6 +88,7 @@ public function testHrtimeMockIsRegistered(string $namespace) #[DataProvider('mockedNamespaces')] #[Group('dns-sensitive')] + #[DnsSensitive('App\Bar\B')] public function testCheckdnsrrMockIsRegistered(string $namespace) { $this->assertTrue(\function_exists(\sprintf('%s\checkdnsrr', $namespace))); @@ -84,6 +96,7 @@ public function testCheckdnsrrMockIsRegistered(string $namespace) #[DataProvider('mockedNamespaces')] #[Group('dns-sensitive')] + #[DnsSensitive('App\Bar\B')] public function testDnsCheckRecordMockIsRegistered(string $namespace) { $this->assertTrue(\function_exists(\sprintf('%s\dns_check_record', $namespace))); @@ -91,6 +104,7 @@ public function testDnsCheckRecordMockIsRegistered(string $namespace) #[DataProvider('mockedNamespaces')] #[Group('dns-sensitive')] + #[DnsSensitive('App\Bar\B')] public function testGetmxrrMockIsRegistered(string $namespace) { $this->assertTrue(\function_exists(\sprintf('%s\getmxrr', $namespace))); @@ -98,6 +112,7 @@ public function testGetmxrrMockIsRegistered(string $namespace) #[DataProvider('mockedNamespaces')] #[Group('dns-sensitive')] + #[DnsSensitive('App\Bar\B')] public function testDnsGetMxMockIsRegistered(string $namespace) { $this->assertTrue(\function_exists(\sprintf('%s\dns_get_mx', $namespace))); @@ -105,6 +120,7 @@ public function testDnsGetMxMockIsRegistered(string $namespace) #[DataProvider('mockedNamespaces')] #[Group('dns-sensitive')] + #[DnsSensitive('App\Bar\B')] public function testGethostbyaddrMockIsRegistered(string $namespace) { $this->assertTrue(\function_exists(\sprintf('%s\gethostbyaddr', $namespace))); @@ -112,6 +128,7 @@ public function testGethostbyaddrMockIsRegistered(string $namespace) #[DataProvider('mockedNamespaces')] #[Group('dns-sensitive')] + #[DnsSensitive('App\Bar\B')] public function testGethostbynameMockIsRegistered(string $namespace) { $this->assertTrue(\function_exists(\sprintf('%s\gethostbyname', $namespace))); @@ -119,6 +136,7 @@ public function testGethostbynameMockIsRegistered(string $namespace) #[DataProvider('mockedNamespaces')] #[Group('dns-sensitive')] + #[DnsSensitive('App\Bar\B')] public function testGethostbynamelMockIsRegistered(string $namespace) { $this->assertTrue(\function_exists(\sprintf('%s\gethostbynamel', $namespace))); @@ -126,6 +144,7 @@ public function testGethostbynamelMockIsRegistered(string $namespace) #[DataProvider('mockedNamespaces')] #[Group('dns-sensitive')] + #[DnsSensitive('App\Bar\B')] public function testDnsGetRecordMockIsRegistered(string $namespace) { $this->assertTrue(\function_exists(\sprintf('%s\dns_get_record', $namespace))); @@ -136,5 +155,7 @@ public static function mockedNamespaces(): iterable yield 'test class namespace' => [__NAMESPACE__]; yield 'namespace derived from test namespace' => ['Symfony\Bridge\PhpUnit']; yield 'explicitly configured namespace' => ['App']; + yield 'explicitly configured namespace through attribute on class' => ['App\Foo']; + yield 'explicitly configured namespace through attribute on method' => ['App\Bar']; } } diff --git a/src/Symfony/Bridge/PhpUnit/Tests/symfonyextension.phpt b/src/Symfony/Bridge/PhpUnit/Tests/symfonyextension.phpt index 2c808c2f5930..933352f07ead 100644 --- a/src/Symfony/Bridge/PhpUnit/Tests/symfonyextension.phpt +++ b/src/Symfony/Bridge/PhpUnit/Tests/symfonyextension.phpt @@ -11,9 +11,10 @@ PHPUnit %s Runtime: PHP %s Configuration: %s/src/Symfony/Bridge/PhpUnit/Tests/Fixtures/symfonyextension/phpunit-with-extension.xml.dist -D............................................. 46 / 46 (100%) +D................................................................ 65 / 76 ( 85%) +........... 76 / 76 (100%) Time: %s, Memory: %s OK, but there were issues! -Tests: 46, Assertions: 46, Deprecations: 1. +Tests: 76, Assertions: 76, Deprecations: 1. diff --git a/src/Symfony/Bridge/PhpUnit/Tests/symfonyextensionnotregistered.phpt b/src/Symfony/Bridge/PhpUnit/Tests/symfonyextensionnotregistered.phpt index aa3d4d3044de..e66b677f772e 100644 --- a/src/Symfony/Bridge/PhpUnit/Tests/symfonyextensionnotregistered.phpt +++ b/src/Symfony/Bridge/PhpUnit/Tests/symfonyextensionnotregistered.phpt @@ -11,11 +11,12 @@ PHPUnit %s Runtime: PHP %s Configuration: %s/src/Symfony/Bridge/PhpUnit/Tests/Fixtures/symfonyextension/phpunit-without-extension.xml.dist -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 46 / 46 (100%) +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 65 / 76 ( 85%) +FFFFFFFFFFF 76 / 76 (100%) Time: %s, Memory: %s -There were 46 failures: +There were 76 failures: %d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testExtensionOfFinalClass Expected deprecation with message "The "Symfony\Bridge\PhpUnit\Tests\Fixtures\symfonyextension\src\FinalClass" class is considered final. It may change without further notice as of its next major version. You should not extend it from "Symfony\Bridge\PhpUnit\Tests\Fixtures\symfonyextension\src\ClassExtendingFinalClass"." was not triggered @@ -40,6 +41,18 @@ Failed asserting that false is true. %s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d %s/.phpunit/phpunit-%s/phpunit:%d +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testTimeMockIsRegistered with data set "explicitly configured namespace through attribute on class" ('App\Foo') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testTimeMockIsRegistered with data set "explicitly configured namespace through attribute on method" ('App\Bar') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + %d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testMicrotimeMockIsRegistered with data set "test class namespace" ('Symfony\Bridge\PhpUnit\Tests') Failed asserting that false is true. @@ -58,6 +71,18 @@ Failed asserting that false is true. %s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d %s/.phpunit/phpunit-%s/phpunit:%d +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testMicrotimeMockIsRegistered with data set "explicitly configured namespace through attribute on class" ('App\Foo') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testMicrotimeMockIsRegistered with data set "explicitly configured namespace through attribute on method" ('App\Bar') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + %d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testSleepMockIsRegistered with data set "test class namespace" ('Symfony\Bridge\PhpUnit\Tests') Failed asserting that false is true. @@ -76,6 +101,18 @@ Failed asserting that false is true. %s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d %s/.phpunit/phpunit-%s/phpunit:%d +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testSleepMockIsRegistered with data set "explicitly configured namespace through attribute on class" ('App\Foo') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testSleepMockIsRegistered with data set "explicitly configured namespace through attribute on method" ('App\Bar') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + %d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testUsleepMockIsRegistered with data set "test class namespace" ('Symfony\Bridge\PhpUnit\Tests') Failed asserting that false is true. @@ -94,6 +131,18 @@ Failed asserting that false is true. %s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d %s/.phpunit/phpunit-%s/phpunit:%d +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testUsleepMockIsRegistered with data set "explicitly configured namespace through attribute on class" ('App\Foo') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testUsleepMockIsRegistered with data set "explicitly configured namespace through attribute on method" ('App\Bar') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + %d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testDateMockIsRegistered with data set "test class namespace" ('Symfony\Bridge\PhpUnit\Tests') Failed asserting that false is true. @@ -112,6 +161,18 @@ Failed asserting that false is true. %s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d %s/.phpunit/phpunit-%s/phpunit:%d +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testDateMockIsRegistered with data set "explicitly configured namespace through attribute on class" ('App\Foo') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testDateMockIsRegistered with data set "explicitly configured namespace through attribute on method" ('App\Bar') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + %d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testGmdateMockIsRegistered with data set "test class namespace" ('Symfony\Bridge\PhpUnit\Tests') Failed asserting that false is true. @@ -130,6 +191,18 @@ Failed asserting that false is true. %s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d %s/.phpunit/phpunit-%s/phpunit:%d +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testGmdateMockIsRegistered with data set "explicitly configured namespace through attribute on class" ('App\Foo') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testGmdateMockIsRegistered with data set "explicitly configured namespace through attribute on method" ('App\Bar') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + %d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testHrtimeMockIsRegistered with data set "test class namespace" ('Symfony\Bridge\PhpUnit\Tests') Failed asserting that false is true. @@ -148,6 +221,18 @@ Failed asserting that false is true. %s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d %s/.phpunit/phpunit-%s/phpunit:%d +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testHrtimeMockIsRegistered with data set "explicitly configured namespace through attribute on class" ('App\Foo') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testHrtimeMockIsRegistered with data set "explicitly configured namespace through attribute on method" ('App\Bar') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + %d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testCheckdnsrrMockIsRegistered with data set "test class namespace" ('Symfony\Bridge\PhpUnit\Tests') Failed asserting that false is true. @@ -166,6 +251,18 @@ Failed asserting that false is true. %s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d %s/.phpunit/phpunit-%s/phpunit:%d +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testCheckdnsrrMockIsRegistered with data set "explicitly configured namespace through attribute on class" ('App\Foo') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testCheckdnsrrMockIsRegistered with data set "explicitly configured namespace through attribute on method" ('App\Bar') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + %d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testDnsCheckRecordMockIsRegistered with data set "test class namespace" ('Symfony\Bridge\PhpUnit\Tests') Failed asserting that false is true. @@ -184,6 +281,18 @@ Failed asserting that false is true. %s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d %s/.phpunit/phpunit-%s/phpunit:%d +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testDnsCheckRecordMockIsRegistered with data set "explicitly configured namespace through attribute on class" ('App\Foo') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testDnsCheckRecordMockIsRegistered with data set "explicitly configured namespace through attribute on method" ('App\Bar') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + %d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testGetmxrrMockIsRegistered with data set "test class namespace" ('Symfony\Bridge\PhpUnit\Tests') Failed asserting that false is true. @@ -202,6 +311,18 @@ Failed asserting that false is true. %s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d %s/.phpunit/phpunit-%s/phpunit:%d +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testGetmxrrMockIsRegistered with data set "explicitly configured namespace through attribute on class" ('App\Foo') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testGetmxrrMockIsRegistered with data set "explicitly configured namespace through attribute on method" ('App\Bar') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + %d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testDnsGetMxMockIsRegistered with data set "test class namespace" ('Symfony\Bridge\PhpUnit\Tests') Failed asserting that false is true. @@ -220,6 +341,18 @@ Failed asserting that false is true. %s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d %s/.phpunit/phpunit-%s/phpunit:%d +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testDnsGetMxMockIsRegistered with data set "explicitly configured namespace through attribute on class" ('App\Foo') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testDnsGetMxMockIsRegistered with data set "explicitly configured namespace through attribute on method" ('App\Bar') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + %d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testGethostbyaddrMockIsRegistered with data set "test class namespace" ('Symfony\Bridge\PhpUnit\Tests') Failed asserting that false is true. @@ -238,6 +371,18 @@ Failed asserting that false is true. %s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d %s/.phpunit/phpunit-%s/phpunit:%d +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testGethostbyaddrMockIsRegistered with data set "explicitly configured namespace through attribute on class" ('App\Foo') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testGethostbyaddrMockIsRegistered with data set "explicitly configured namespace through attribute on method" ('App\Bar') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + %d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testGethostbynameMockIsRegistered with data set "test class namespace" ('Symfony\Bridge\PhpUnit\Tests') Failed asserting that false is true. @@ -256,6 +401,18 @@ Failed asserting that false is true. %s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d %s/.phpunit/phpunit-%s/phpunit:%d +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testGethostbynameMockIsRegistered with data set "explicitly configured namespace through attribute on class" ('App\Foo') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testGethostbynameMockIsRegistered with data set "explicitly configured namespace through attribute on method" ('App\Bar') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + %d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testGethostbynamelMockIsRegistered with data set "test class namespace" ('Symfony\Bridge\PhpUnit\Tests') Failed asserting that false is true. @@ -274,6 +431,18 @@ Failed asserting that false is true. %s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d %s/.phpunit/phpunit-%s/phpunit:%d +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testGethostbynamelMockIsRegistered with data set "explicitly configured namespace through attribute on class" ('App\Foo') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testGethostbynamelMockIsRegistered with data set "explicitly configured namespace through attribute on method" ('App\Bar') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + %d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testDnsGetRecordMockIsRegistered with data set "test class namespace" ('Symfony\Bridge\PhpUnit\Tests') Failed asserting that false is true. @@ -292,5 +461,17 @@ Failed asserting that false is true. %s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d %s/.phpunit/phpunit-%s/phpunit:%d +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testDnsGetRecordMockIsRegistered with data set "explicitly configured namespace through attribute on class" ('App\Foo') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + +%d) Symfony\Bridge\PhpUnit\Tests\SymfonyExtension::testDnsGetRecordMockIsRegistered with data set "explicitly configured namespace through attribute on method" ('App\Bar') +Failed asserting that false is true. + +%s/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtension.php:%d +%s/.phpunit/phpunit-%s/phpunit:%d + FAILURES! -Tests: 46, Assertions: 46, Failures: 46. +Tests: 76, Assertions: 76, Failures: 76. pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy