diff options
Diffstat (limited to 'tests/phpunit/integration/includes')
-rw-r--r-- | tests/phpunit/integration/includes/Permissions/RateLimiterTest.php | 132 |
1 files changed, 54 insertions, 78 deletions
diff --git a/tests/phpunit/integration/includes/Permissions/RateLimiterTest.php b/tests/phpunit/integration/includes/Permissions/RateLimiterTest.php index 36d959bb6b6e..29fb1b8d499c 100644 --- a/tests/phpunit/integration/includes/Permissions/RateLimiterTest.php +++ b/tests/phpunit/integration/includes/Permissions/RateLimiterTest.php @@ -2,8 +2,6 @@ namespace MediaWiki\Tests\Integration\Permissions; -use Liuggio\StatsdClient\Entity\StatsdData; -use Liuggio\StatsdClient\Entity\StatsdDataInterface; use MediaWiki\Config\ServiceOptions; use MediaWiki\MainConfigNames; use MediaWiki\Permissions\RateLimiter; @@ -14,7 +12,7 @@ use MediaWiki\User\UserIdentityValue; use MediaWikiIntegrationTestCase; use PHPUnit\Framework\MockObject\MockObject; use Wikimedia\ObjectCache\HashBagOStuff; -use Wikimedia\Stats\BufferingStatsdDataFactory; +use Wikimedia\Stats\StatsFactory; use Wikimedia\TestingAccessWrapper; use Wikimedia\WRStats\BagOStuffStatsStore; use Wikimedia\WRStats\WRStatsFactory; @@ -77,11 +75,10 @@ class RateLimiterTest extends MediaWikiIntegrationTestCase { $cacheAccess = TestingAccessWrapper::newFromObject( $cache ); $cacheAccess->keyspace = 'xwiki'; - $statsFactory = new WRStatsFactory( new BagOStuffStatsStore( $cache ) ); - - $stats = new BufferingStatsdDataFactory( 'test.' ); - $limiter = $this->newRateLimiter( $limits, [], $statsFactory ); - $limiter->setStats( $stats ); + $wrStatsFactory = new WRStatsFactory( new BagOStuffStatsStore( $cache ) ); + $statsHelper = StatsFactory::newUnitTestingHelper(); + $limiter = $this->newRateLimiter( $limits, [], $wrStatsFactory ); + $limiter->setStats( $statsHelper->getStatsFactory() ); // Set up some fake users $anon1 = $this->newFakeAnon( '1.2.3.4' ); @@ -144,15 +141,20 @@ class RateLimiterTest extends MediaWikiIntegrationTestCase { $this->assertFalse( $limiter->limit( $karaY1, 'move' ), 'Move by another user' ); $this->assertTrue( $limiter->limit( $karaY1, 'move' ), 'Second move by another user' ); - // Check stats entries for conditions - $statsData = $stats->getData(); - $this->assertStatsHasCount( 'test.RateLimiter.limit.edit.tripped_by.anon', 1, $statsData ); - $this->assertStatsHasCount( 'test.RateLimiter.limit.purge.tripped_by.ip', 1, $statsData ); - $this->assertStatsHasCount( 'test.RateLimiter.limit.purge.tripped_by.subnet', 1, $statsData ); - $this->assertStatsHasCount( 'test.RateLimiter.limit.delete.tripped_by.ip_all', 1, $statsData ); - $this->assertStatsHasCount( 'test.RateLimiter.limit.delete.tripped_by.subnet_all', 1, $statsData ); - $this->assertStatsHasCount( 'test.RateLimiter.limit.rollback.tripped_by.user', 1, $statsData ); - $this->assertStatsHasCount( 'test.RateLimiter.limit.move.tripped_by.user_global', 1, $statsData ); + $actual = $statsHelper->count( 'RateLimiter_limit_cause_total{action="edit",tripped_by="anon"}' ); + $this->assertEquals( 2, $actual ); + $actual = $statsHelper->count( 'RateLimiter_limit_cause_total{action="purge",tripped_by="ip"}' ); + $this->assertEquals( 5, $actual ); + $actual = $statsHelper->count( 'RateLimiter_limit_cause_total{action="purge",tripped_by="subnet"}' ); + $this->assertEquals( 7, $actual ); + $actual = $statsHelper->count( 'RateLimiter_limit_cause_total{action="delete",tripped_by="ip_all"}' ); + $this->assertEquals( 7, $actual ); + $actual = $statsHelper->count( 'RateLimiter_limit_cause_total{action="delete",tripped_by="subnet_all"}' ); + $this->assertEquals( 8, $actual ); + $actual = $statsHelper->count( 'RateLimiter_limit_cause_total{action="rollback",tripped_by="user"}' ); + $this->assertEquals( 2, $actual ); + $actual = $statsHelper->count( 'RateLimiter_limit_cause_total{action="move",tripped_by="user_global"}' ); + $this->assertEquals( 10, $actual ); } public function testPingLimiterWithStaleCache() { @@ -229,11 +231,12 @@ class RateLimiterTest extends MediaWikiIntegrationTestCase { ], ]; - $stats = new BufferingStatsdDataFactory( 'test.' ); + $statsHelper = StatsFactory::newUnitTestingHelper(); + $statsFactory = $statsHelper->getStatsFactory(); $user = $this->newFakeUser( 'Frank', '1.2.3.4', 111 ); $limiter = $this->newRateLimiter( $limits, [] ); - $limiter->setStats( $stats ); + $limiter->setStats( $statsFactory ); // Hook leaves $result false $this->setTemporaryHook( @@ -272,12 +275,14 @@ class RateLimiterTest extends MediaWikiIntegrationTestCase { 'Actions with no rate limit set do not trip the rate limiter' ); - $statsData = $stats->getData(); - $this->assertStatsHasCount( 'test.RateLimiter.limit.edit.result.passed_by_hook', 1, $statsData ); - $this->assertStatsHasCount( 'test.RateLimiter.limit.edit.result.tripped_by_hook', 1, $statsData ); - - $this->assertStatsNotHasCount( 'test.RateLimiter.limit.edit.result.passed', $statsData ); - $this->assertStatsNotHasCount( 'test.RateLimiter.limit.edit.result.tripped', $statsData ); + $actual = $statsHelper->count( 'RateLimiter_limit_actions_total{action="edit",tripped_by="passed_by_hook"}' ); + $this->assertEquals( 2, $actual ); + $actual = $statsHelper->count( 'RateLimiter_limit_actions_total{action="edit",tripped_by="tripped_by_hook"}' ); + $this->assertEquals( 2, $actual ); + $actual = $statsHelper->count( 'RateLimiter_limit_actions_total{action="edit",tripped_by="passed"}' ); + $this->assertEquals( 2, $actual ); + $actual = $statsHelper->count( 'RateLimiter_limit_actions_total{action="edit",tripped_by="tripped"}' ); + $this->assertEquals( 2, $actual ); } public function testIsLimitableAction() { @@ -408,18 +413,20 @@ class RateLimiterTest extends MediaWikiIntegrationTestCase { $newbie2 = $this->newFakeUser( 'User2', '127.0.0.1', 2, true ); $newbie3 = $this->newFakeUser( 'User3', '127.0.0.1', 3, true ); - $stats = new BufferingStatsdDataFactory( 'test.' ); + $statsHelper = StatsFactory::newUnitTestingHelper(); $limiter = $this->newRateLimiter( $limits, [] ); - $limiter->setStats( $stats ); + $limiter->setStats( $statsHelper->getStatsFactory() ); $this->assertFalse( $limiter->limit( $newbie1, 'edit' ) ); $this->assertFalse( $limiter->limit( $newbie2, 'edit' ) ); $this->assertTrue( $limiter->limit( $newbie3, 'edit' ) ); - $statsData = $stats->getData(); - $this->assertStatsHasCount( 'test.RateLimiter.limit.edit.result.passed', 1, $statsData ); - $this->assertStatsHasCount( 'test.RateLimiter.limit.edit.result.tripped', 1, $statsData ); - $this->assertStatsHasCount( 'test.RateLimiter.limit.edit.tripped_by.ip', 1, $statsData ); + $actual = $statsHelper->count( 'RateLimiter_limit_actions_total{action="edit",result="passed"}' ); + $this->assertEquals( 5, $actual ); + $actual = $statsHelper->count( 'RateLimiter_limit_actions_total{action="edit",result="tripped"}' ); + $this->assertEquals( 4, $actual ); + $actual = $statsHelper->count( 'RateLimiter_limit_cause_total{action="edit",tripped_by="ip"}' ); + $this->assertEquals( 2, $actual ); } /** @@ -467,9 +474,9 @@ class RateLimiterTest extends MediaWikiIntegrationTestCase { [ RateLimitSubject::EXEMPT => true ] ); - $stats = new BufferingStatsdDataFactory( 'test.' ); + $statsHelper = StatsFactory::newUnitTestingHelper(); $limiter = $this->newRateLimiter( $limits, [] ); - $limiter->setStats( $stats ); + $limiter->setStats( $statsHelper->getStatsFactory() ); $this->assertFalse( $limiter->limit( $user, 'edit' ) ); $this->assertFalse( $limiter->limit( $user, 'delete' ) ); @@ -477,10 +484,12 @@ class RateLimiterTest extends MediaWikiIntegrationTestCase { $this->assertFalse( $limiter->limit( $user, 'edit' ), 'bypass should be granted' ); $this->assertTrue( $limiter->limit( $user, 'delete' ), 'bypass should be denied' ); - $statsData = $stats->getData(); - $this->assertStatsHasCount( 'test.RateLimiter.limit.edit.result.exempt', 1, $statsData ); - $this->assertStatsNotHasCount( 'test.RateLimiter.limit.delete.result.exempt', $statsData ); - $this->assertStatsHasCount( 'test.RateLimiter.limit.delete.result.tripped', 1, $statsData ); + $actual = $statsHelper->count( 'RateLimiter_limit_actions_total{action="edit",result="exempt"}' ); + $this->assertEquals( 4, $actual ); + $actual = $statsHelper->count( 'RateLimiter_limit_actions_total{action="delete",result="exempt"}' ); + $this->assertEquals( 2, $actual ); + $actual = $statsHelper->count( 'RateLimiter_limit_actions_total{action="delete",result="tripped"}' ); + $this->assertEquals( 3, $actual ); } /** @@ -498,52 +507,19 @@ class RateLimiterTest extends MediaWikiIntegrationTestCase { $user = $this->getTestUser( [ 'autoconfirmed' ] )->getUser(); $user = new RateLimitSubject( $user, '127.0.0.1', [] ); - $stats = new BufferingStatsdDataFactory( 'test.' ); + $statsHelper = StatsFactory::newUnitTestingHelper(); $limiter = $this->newRateLimiter( $limits, [] ); - $limiter->setStats( $stats ); + $limiter->setStats( $statsHelper->getStatsFactory() ); $this->assertFalse( $limiter->limit( $user, 'edit' ) ); $this->assertFalse( $limiter->limit( $user, 'edit' ), 'limit for autoconfirmed used' ); $this->assertTrue( $limiter->limit( $user, 'edit' ), 'limit for autoconfirmed exceeded' ); - $statsData = $stats->getData(); - $this->assertStatsHasCount( 'test.RateLimiter.limit.edit.result.passed', 1, $statsData ); - $this->assertStatsHasCount( 'test.RateLimiter.limit.edit.result.tripped', 1, $statsData ); - $this->assertStatsHasCount( 'test.RateLimiter.limit.edit.tripped_by.autoconfirmed', 1, $statsData ); + $actual = $statsHelper->count( 'RateLimiter_limit_actions_total{action="edit",result="passed"}' ); + $this->assertEquals( 5, $actual ); + $actual = $statsHelper->count( 'RateLimiter_limit_actions_total{action="edit",result="tripped"}' ); + $this->assertEquals( 4, $actual ); + $actual = $statsHelper->count( 'RateLimiter_limit_cause_total{action="edit",tripped_by="autoconfirmed"}' ); + $this->assertEquals( 2, $actual ); } - - /** - * @param string $key - * @param ?int $value - * @param StatsdData[] $statsData - */ - private function assertStatsHasCount( string $key, ?int $value, array $statsData ) { - $metric = StatsdDataInterface::STATSD_METRIC_COUNT; - - foreach ( $statsData as $data ) { - if ( $data->getMetric() === $metric && $data->getValue() === $value && $data->getKey() == $key ) { - $this->addToAssertionCount( 1 ); - return; - } - } - - $this->fail( "Missing metric data entry: $key/$metric/$value" ); - } - - /** - * @param string $key - * @param StatsdData[] $statsData - */ - private function assertStatsNotHasCount( string $key, array $statsData ) { - $metric = StatsdDataInterface::STATSD_METRIC_COUNT; - - foreach ( $statsData as $data ) { - if ( $data->getMetric() === $metric && $data->getKey() == $key ) { - $this->fail( "Metric data entry was not expected to be present: $key/$metric" ); - } - } - - $this->addToAssertionCount( 1 ); - } - } |