mirror of
https://github.com/gosticks/wordpress-develop.git
synced 2026-03-31 02:34:38 +00:00
Cron: Ensure identical single events aren't scheduled less than 10min apart.
Improves the logic in `wp_schedule_single_event()` to ensure an identical event is not scheduled within ten minutes. This moves the logic for checking for identical events to be self contained rather than relying on `wp_next_scheduled()` as this fails to account for events with a past timestamp when wp-cron fails to trigger or for multiple identical events being scheduled already. Props bodohugobarwich. Fixes #44818. git-svn-id: https://develop.svn.wordpress.org/trunk@44917 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
@@ -596,4 +596,88 @@ class Tests_Cron extends WP_UnitTestCase {
|
||||
$this->assertFalse( wp_get_scheduled_event( $hook, $args, 'Words Fail!' ) );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure any past event counts as a duplicate.
|
||||
*
|
||||
* @ticket 44818
|
||||
*/
|
||||
function test_duplicate_past_event() {
|
||||
$hook = __FUNCTION__;
|
||||
$args = array( 'arg1' );
|
||||
$ts1 = strtotime( '-14 minutes' );
|
||||
$ts2 = strtotime( '+5 minutes' );
|
||||
$ts3 = strtotime( '-2 minutes' );
|
||||
|
||||
// First event scheduled successfully.
|
||||
$this->assertTrue( wp_schedule_single_event( $ts1, $hook, $args ) );
|
||||
|
||||
// Second event fails.
|
||||
$this->assertFalse( wp_schedule_single_event( $ts2, $hook, $args ) );
|
||||
|
||||
// Third event fails.
|
||||
$this->assertFalse( wp_schedule_single_event( $ts3, $hook, $args ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure any near future event counts as a duplicate.
|
||||
*
|
||||
* @ticket 44818
|
||||
*/
|
||||
function test_duplicate_near_future_event() {
|
||||
$hook = __FUNCTION__;
|
||||
$args = array( 'arg1' );
|
||||
$ts1 = strtotime( '+4 minutes' );
|
||||
$ts2 = strtotime( '-15 minutes' );
|
||||
$ts3 = strtotime( '+12 minutes' );
|
||||
|
||||
// First event scheduled successfully.
|
||||
$this->assertTrue( wp_schedule_single_event( $ts1, $hook, $args ) );
|
||||
|
||||
// Second event fails.
|
||||
$this->assertFalse( wp_schedule_single_event( $ts2, $hook, $args ) );
|
||||
|
||||
// Third event fails.
|
||||
$this->assertFalse( wp_schedule_single_event( $ts3, $hook, $args ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Duplicate future events are disallowed.
|
||||
*
|
||||
* @ticket 44818
|
||||
*/
|
||||
function test_duplicate_future_event() {
|
||||
$hook = __FUNCTION__;
|
||||
$args = array( 'arg1' );
|
||||
$ts1 = strtotime( '+15 minutes' );
|
||||
$ts2 = strtotime( '-600 seconds', $ts1 );
|
||||
$ts3 = strtotime( '+600 seconds', $ts1 );
|
||||
|
||||
// First event scheduled successfully.
|
||||
$this->assertTrue( wp_schedule_single_event( $ts1, $hook, $args ) );
|
||||
|
||||
// Events within ten minutes should fail.
|
||||
$this->assertFalse( wp_schedule_single_event( $ts2, $hook, $args ) );
|
||||
$this->assertFalse( wp_schedule_single_event( $ts3, $hook, $args ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Future events are allowed.
|
||||
*
|
||||
* @ticket 44818
|
||||
*/
|
||||
function test_not_duplicate_future_event() {
|
||||
$hook = __FUNCTION__;
|
||||
$args = array( 'arg1' );
|
||||
$ts1 = strtotime( '+15 minutes' );
|
||||
$ts2 = strtotime( '-601 seconds', $ts1 );
|
||||
$ts3 = strtotime( '+601 seconds', $ts1 );
|
||||
|
||||
// First event scheduled successfully.
|
||||
$this->assertTrue( wp_schedule_single_event( $ts1, $hook, $args ) );
|
||||
|
||||
// Events over ten minutes should work.
|
||||
$this->assertTrue( wp_schedule_single_event( $ts2, $hook, $args ) );
|
||||
$this->assertTrue( wp_schedule_single_event( $ts3, $hook, $args ) );
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user