aboutsummaryrefslogtreecommitdiffstats
path: root/tests/phpunit/integration/includes
diff options
context:
space:
mode:
Diffstat (limited to 'tests/phpunit/integration/includes')
-rw-r--r--tests/phpunit/integration/includes/Permissions/RateLimiterTest.php132
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 );
- }
-
}