Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F4128429
PingbackTest.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
PingbackTest.php
View Options
<?php
use
MediaWiki\Config\HashConfig
;
use
MediaWiki\Http\HttpRequestFactory
;
use
MediaWiki\Installer\Pingback
;
use
MediaWiki\MainConfigNames
;
use
MediaWiki\Status\Status
;
use
Psr\Log\NullLogger
;
use
Wikimedia\ObjectCache\BagOStuff
;
use
Wikimedia\ObjectCache\HashBagOStuff
;
use
Wikimedia\Rdbms\IConnectionProvider
;
use
Wikimedia\Rdbms\IDatabase
;
use
Wikimedia\Rdbms\InsertQueryBuilder
;
use
Wikimedia\Rdbms\SelectQueryBuilder
;
use
Wikimedia\Timestamp\ConvertibleTimestamp
;
/**
* @covers \MediaWiki\Installer\Pingback
*/
class
PingbackTest
extends
MediaWikiUnitTestCase
{
protected
function
setUp
():
void
{
parent
::
setUp
();
ConvertibleTimestamp
::
setFakeTime
(
'20110401090000'
);
}
/**
* @param IDatabase $database
* @param HttpRequestFactory $httpRequestFactory
* @param bool $enablePingback
* @param BagOStuff|null $cache
* @return Pingback
*/
private
function
makePingback
(
IDatabase
$database
,
$httpRequestFactory
,
bool
$enablePingback
=
true
,
$cache
=
null
)
{
$dbProvider
=
$this
->
createNoOpMock
(
IConnectionProvider
::
class
,
[
'getPrimaryDatabase'
,
'getReplicaDatabase'
]
);
$dbProvider
->
method
(
'getPrimaryDatabase'
)->
willReturn
(
$database
);
$dbProvider
->
method
(
'getReplicaDatabase'
)->
willReturn
(
$database
);
return
new
MockPingback
(
new
HashConfig
(
[
MainConfigNames
::
Pingback
=>
$enablePingback
]
),
$dbProvider
,
$cache
??
new
HashBagOStuff
(),
$httpRequestFactory
,
new
NullLogger
()
);
}
public
function
testDisabled
()
{
// Scenario: Disabled
$pingback
=
$this
->
makePingback
(
$this
->
createNoOpMock
(
IDatabase
::
class
),
$this
->
createNoOpMock
(
HttpRequestFactory
::
class
),
false
/* $enablePingback */
);
// Expect:
// - no db select, lock, or upsert (asserted via no-op mock)
// - no HTTP request (asserted via no-op mock)
$pingback
->
run
();
}
public
function
testCacheBusy
()
{
// Scenario:
// - enabled
// - table is empty
// - cache lock is unavailable
$database
=
$this
->
createNoOpMock
(
IDatabase
::
class
,
[
'selectField'
,
'newSelectQueryBuilder'
]
);
$database
->
expects
(
$this
->
once
()
)->
method
(
'selectField'
)->
willReturn
(
false
);
$database
->
method
(
'newSelectQueryBuilder'
)->
willReturnCallback
(
static
fn
()
=>
new
SelectQueryBuilder
(
$database
)
);
$cache
=
$this
->
createMock
(
BagOStuff
::
class
);
$cache
->
method
(
'add'
)->
willReturn
(
false
);
$pingback
=
$this
->
makePingback
(
$database
,
$this
->
createNoOpMock
(
HttpRequestFactory
::
class
),
true
,
/* $enablePingback */
$cache
);
// Expect:
// - no db lock
// - no HTTP request
// - no db upsert for timestamp
$pingback
->
run
();
}
public
function
testDbBusy
()
{
// Scenario:
// - enabled
// - table is empty
// - cache lock is available
// - db lock is unavailable
$database
=
$this
->
createNoOpMock
(
IDatabase
::
class
,
[
'selectField'
,
'lock'
,
'newSelectQueryBuilder'
]
);
$database
->
expects
(
$this
->
once
()
)->
method
(
'selectField'
)->
willReturn
(
false
);
$database
->
expects
(
$this
->
once
()
)->
method
(
'lock'
)->
willReturn
(
false
);
$database
->
method
(
'newSelectQueryBuilder'
)->
willReturnCallback
(
static
fn
()
=>
new
SelectQueryBuilder
(
$database
)
);
$pingback
=
$this
->
makePingback
(
$database
,
$this
->
createNoOpMock
(
HttpRequestFactory
::
class
)
);
// Expect:
// - no HTTP request
// - no db upsert for timestamp
$pingback
->
run
();
}
/**
* @dataProvider provideMakePing
*/
public
function
testMakePing
(
$priorPing
)
{
// Scenario:
// - enabled
// - table is either
// - empty ($priorPing is false)
// - has a ping from over a month ago ($piorPing)
// - cache lock and db lock are available
$database
=
$this
->
createNoOpMock
(
IDatabase
::
class
,
[
'selectField'
,
'lock'
,
'upsert'
,
'newSelectQueryBuilder'
,
'newInsertQueryBuilder'
]
);
$httpRequestFactory
=
$this
->
createNoOpMock
(
HttpRequestFactory
::
class
,
[
'create'
]
);
$httpRequest
=
$this
->
createNoOpMock
(
MWHttpRequest
::
class
,
[
'setHeader'
,
'execute'
]
);
$database
->
expects
(
$this
->
once
()
)->
method
(
'selectField'
)->
willReturn
(
$priorPing
);
$database
->
expects
(
$this
->
once
()
)->
method
(
'lock'
)->
willReturn
(
true
);
$httpRequestFactory
->
expects
(
$this
->
once
()
)
->
method
(
'create'
)
->
with
(
'https://intake-analytics.wikimedia.org/v1/events?hasty=true'
,
[
'method'
=>
'POST'
,
'postData'
=>
'{"some":"stuff"}'
,
]
)
->
willReturn
(
$httpRequest
);
$httpRequest
->
expects
(
$this
->
once
()
)
->
method
(
'execute'
)
->
willReturn
(
Status
::
newGood
()
);
$database
->
expects
(
$this
->
once
()
)->
method
(
'upsert'
);
$database
->
method
(
'newSelectQueryBuilder'
)->
willReturnCallback
(
static
fn
()
=>
new
SelectQueryBuilder
(
$database
)
);
$database
->
method
(
'newInsertQueryBuilder'
)->
willReturnCallback
(
static
fn
()
=>
new
InsertQueryBuilder
(
$database
)
);
$pingback
=
$this
->
makePingback
(
$database
,
$httpRequestFactory
);
// Expect:
// - db lock acquired
// - HTTP POST request
// - db upsert for timestamp
$pingback
->
run
();
}
public
static
function
provideMakePing
()
{
yield
'No prior ping'
=>
[
false
];
yield
'Prior ping from over a month ago'
=>
[
ConvertibleTimestamp
::
convert
(
TS_UNIX
,
'20110301080000'
)
];
}
public
function
testAfterRecentPing
()
{
// Scenario:
// - enabled
// - table contains a ping from one hour ago
// - cache lock and db lock are available
$database
=
$this
->
createNoOpMock
(
IDatabase
::
class
,
[
'selectField'
,
'newSelectQueryBuilder'
]
);
$database
->
expects
(
$this
->
once
()
)->
method
(
'selectField'
)->
willReturn
(
ConvertibleTimestamp
::
convert
(
TS_UNIX
,
'20110401080000'
)
);
$database
->
method
(
'newSelectQueryBuilder'
)->
willReturnCallback
(
static
fn
()
=>
new
SelectQueryBuilder
(
$database
)
);
$pingback
=
$this
->
makePingback
(
$database
,
$this
->
createNoOpMock
(
HttpRequestFactory
::
class
)
);
// Expect:
// - no db lock
// - no HTTP request
// - no db upsert for timestamp
$pingback
->
run
();
}
}
class
MockPingback
extends
Pingback
{
protected
function
getData
():
array
{
return
[
'some'
=>
'stuff'
];
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Wed, Aug 19, 09:15 (2 w, 6 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
a0/df/ebf9da141b8a6d4082457a427f92
Default Alt Text
PingbackTest.php (5 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment