diff options
Diffstat (limited to 'tests/phpunit/tests/cron.php')
-rw-r--r-- | tests/phpunit/tests/cron.php | 310 |
1 files changed, 310 insertions, 0 deletions
diff --git a/tests/phpunit/tests/cron.php b/tests/phpunit/tests/cron.php new file mode 100644 index 0000000000..b97cfcf915 --- /dev/null +++ b/tests/phpunit/tests/cron.php @@ -0,0 +1,310 @@ +<?php + +/** + * Test the cron scheduling functions + * + * @group cron + */ +class Tests_Cron extends WP_UnitTestCase { + function setUp() { + parent::setUp(); + // make sure the schedule is clear + _set_cron_array(array()); + } + + function tearDown() { + parent::tearDown(); + // make sure the schedule is clear + _set_cron_array(array()); + } + + function test_wp_get_schedule_empty() { + // nothing scheduled + $hook = rand_str(); + $this->assertFalse(wp_get_schedule($hook)); + } + + function test_schedule_event_single() { + // schedule an event and make sure it's returned by wp_next_scheduled + $hook = rand_str(); + $timestamp = strtotime('+1 hour'); + + wp_schedule_single_event( $timestamp, $hook ); + $this->assertEquals( $timestamp, wp_next_scheduled($hook) ); + + // it's a non recurring event + $this->assertEquals( '', wp_get_schedule($hook) ); + + } + + function test_schedule_event_single_args() { + // schedule an event with arguments and make sure it's returned by wp_next_scheduled + $hook = rand_str(); + $timestamp = strtotime('+1 hour'); + $args = array(rand_str()); + + wp_schedule_single_event( $timestamp, $hook, $args ); + // this returns the timestamp only if we provide matching args + $this->assertEquals( $timestamp, wp_next_scheduled($hook, $args) ); + // these don't match so return nothing + $this->assertEquals( false, wp_next_scheduled($hook) ); + $this->assertEquals( false, wp_next_scheduled($hook, array(rand_str())) ); + + // it's a non recurring event + $this->assertEquals( '', wp_get_schedule($hook, $args) ); + } + + function test_schedule_event() { + // schedule an event and make sure it's returned by wp_next_scheduled + $hook = rand_str(); + $recur = 'hourly'; + $timestamp = strtotime('+1 hour'); + + wp_schedule_event( $timestamp, $recur, $hook ); + // it's scheduled for the right time + $this->assertEquals( $timestamp, wp_next_scheduled($hook) ); + // it's a recurring event + $this->assertEquals( $recur, wp_get_schedule($hook) ); + } + + function test_schedule_event_args() { + // schedule an event and make sure it's returned by wp_next_scheduled + $hook = rand_str(); + $timestamp = strtotime('+1 hour'); + $recur = 'hourly'; + $args = array(rand_str()); + + wp_schedule_event( $timestamp, 'hourly', $hook, $args ); + // this returns the timestamp only if we provide matching args + $this->assertEquals( $timestamp, wp_next_scheduled($hook, $args) ); + // these don't match so return nothing + $this->assertEquals( false, wp_next_scheduled($hook) ); + $this->assertEquals( false, wp_next_scheduled($hook, array(rand_str())) ); + + $this->assertEquals( $recur, wp_get_schedule($hook, $args) ); + + } + + function test_unschedule_event() { + // schedule an event and make sure it's returned by wp_next_scheduled + $hook = rand_str(); + $timestamp = strtotime('+1 hour'); + + wp_schedule_single_event( $timestamp, $hook ); + $this->assertEquals( $timestamp, wp_next_scheduled($hook) ); + + // now unschedule it and make sure it's gone + wp_unschedule_event( $timestamp, $hook ); + $this->assertEquals( false, wp_next_scheduled($hook) ); + } + + function test_clear_schedule() { + $hook = rand_str(); + $args = array(rand_str()); + + // schedule several events with and without arguments + wp_schedule_single_event( strtotime('+1 hour'), $hook ); + wp_schedule_single_event( strtotime('+2 hour'), $hook ); + wp_schedule_single_event( strtotime('+3 hour'), $hook, $args ); + wp_schedule_single_event( strtotime('+4 hour'), $hook, $args ); + + // make sure they're returned by wp_next_scheduled() + $this->assertTrue( wp_next_scheduled($hook) > 0 ); + $this->assertTrue( wp_next_scheduled($hook, $args) > 0 ); + + // clear the schedule for the no args events and make sure it's gone + wp_clear_scheduled_hook($hook); + $this->assertFalse( wp_next_scheduled($hook) ); + // the args events should still be there + $this->assertTrue( wp_next_scheduled($hook, $args) > 0 ); + + // clear the schedule for the args events and make sure they're gone too + // note: wp_clear_scheduled_hook() expects args passed directly, rather than as an array + wp_clear_scheduled_hook($hook, $args[0]); + $this->assertFalse( wp_next_scheduled($hook, $args) ); + } + + function test_clear_schedule_multiple_args() { + $hook = rand_str(); + $args = array(rand_str(), rand_str()); + + // schedule several events with and without arguments + wp_schedule_single_event( strtotime('+1 hour'), $hook ); + wp_schedule_single_event( strtotime('+2 hour'), $hook ); + wp_schedule_single_event( strtotime('+3 hour'), $hook, $args ); + wp_schedule_single_event( strtotime('+4 hour'), $hook, $args ); + + // make sure they're returned by wp_next_scheduled() + $this->assertTrue( wp_next_scheduled($hook) > 0 ); + $this->assertTrue( wp_next_scheduled($hook, $args) > 0 ); + + // clear the schedule for the no args events and make sure it's gone + wp_clear_scheduled_hook($hook); + $this->assertFalse( wp_next_scheduled($hook) ); + // the args events should still be there + $this->assertTrue( wp_next_scheduled($hook, $args) > 0 ); + + // clear the schedule for the args events and make sure they're gone too + // note: wp_clear_scheduled_hook() used to expect args passed directly, rather than as an array pre WP 3.0 + wp_clear_scheduled_hook($hook, $args[0], $args[1]); + $this->assertFalse( wp_next_scheduled($hook, $args) ); + } + + /** + * @ticket 10468 + */ + function test_clear_schedule_new_args() { + $hook = rand_str(); + $args = array(rand_str()); + $multi_hook = rand_str(); + $multi_args = array(rand_str(), rand_str()); + + // schedule several events with and without arguments + wp_schedule_single_event( strtotime('+1 hour'), $hook ); + wp_schedule_single_event( strtotime('+2 hour'), $hook ); + wp_schedule_single_event( strtotime('+3 hour'), $hook, $args ); + wp_schedule_single_event( strtotime('+4 hour'), $hook, $args ); + wp_schedule_single_event( strtotime('+5 hour'), $multi_hook, $multi_args ); + wp_schedule_single_event( strtotime('+6 hour'), $multi_hook, $multi_args ); + + // make sure they're returned by wp_next_scheduled() + $this->assertTrue( wp_next_scheduled($hook) > 0 ); + $this->assertTrue( wp_next_scheduled($hook, $args) > 0 ); + + // clear the schedule for the no args events and make sure it's gone + wp_clear_scheduled_hook($hook); + $this->assertFalse( wp_next_scheduled($hook) ); + // the args events should still be there + $this->assertTrue( wp_next_scheduled($hook, $args) > 0 ); + + // clear the schedule for the args events and make sure they're gone too + // wp_clear_scheduled_hook() should take args as an array like the other functions. + wp_clear_scheduled_hook($hook, $args); + $this->assertFalse( wp_next_scheduled($hook, $args) ); + + // clear the schedule for the args events and make sure they're gone too + // wp_clear_scheduled_hook() should take args as an array like the other functions and does from WP 3.0 + wp_clear_scheduled_hook($multi_hook, $multi_args); + $this->assertFalse( wp_next_scheduled($multi_hook, $multi_args) ); + + } + + /** + * @ticket 6966 + */ + function test_duplicate_event() { + // duplicate events close together should be skipped + $hook = rand_str(); + $args = array(rand_str()); + $ts1 = strtotime('+5 minutes'); + $ts2 = strtotime('+3 minutes'); + + // first one works + wp_schedule_single_event( $ts1, $hook, $args ); + // second one is ignored + wp_schedule_single_event( $ts2, $hook, $args ); + + // the next event should be at +5 minutes, not +3 + $this->assertEquals( $ts1, wp_next_scheduled($hook, $args) ); + } + + /** + * @ticket 6966 + */ + function test_not_duplicate_event() { + // duplicate events far apart should work normally + $hook = rand_str(); + $args = array(rand_str()); + $ts1 = strtotime('+30 minutes'); + $ts2 = strtotime('+3 minutes'); + + // first one works + wp_schedule_single_event( $ts1, $hook, $args ); + // second works too + wp_schedule_single_event( $ts2, $hook, $args ); + + // the next event should be at +5 minutes, not +3 + $this->assertEquals( $ts2, wp_next_scheduled($hook, $args) ); + wp_unschedule_event( $ts2, $hook, $args ); + // following event should be there too + $this->assertEquals( $ts1, wp_next_scheduled($hook, $args) ); + } +} + +/* + * Disable the WP Cron running test for the moment as it kills the whole test suite. + * TODO - Fix it to work with the new cron implementation in trunk + * +class WPTestCronRunning extends _WPEmptyBlog { + function setUp() { + parent::setUp(); + // make sure the schedule is clear + _set_cron_array(array()); + } + + function tearDown() { + parent::tearDown(); + // make sure the schedule is clear + _set_cron_array(array()); + } + function _do_cron() { + // FIXME: wp-cron.php is difficult to test, could be wrapped in a function + $_GET['check'] = wp_hash('187425'); + require(ABSPATH.'/wp-cron.php'); + } + + function test_run_schedule_single() { + // schedule an event, run it, and make sure the hook is called + $hook = rand_str(); + $args = array(rand_str()); + $timestamp = strtotime('-1 second'); + + // register a test action + $a = new MockAction(); + add_action($hook, array(&$a, 'action')); + + // schedule an event for 1 second ago + wp_schedule_single_event( $timestamp, $hook, $args ); + $this->assertEquals( $timestamp, wp_next_scheduled($hook, $args) ); + + // run cron jobs + $this->_do_cron(); + + // our action should have been called once with the correct args + $this->assertEquals( 1, $a->get_call_count() ); + $this->assertEquals( array($args), $a->get_args() ); + + // it shouldn't appear in the schedule anymore + $this->assertFalse( wp_next_scheduled($hook, $args) ); + + } + + function test_run_schedule_recurring() { + // schedule a recurring event, run it, and make sure the hook is called + $hook = rand_str(); + $args = array(rand_str()); + $timestamp = strtotime('-1 second'); + $recur = 'hourly'; + + // register a test action + $a = new MockAction(); + add_action($hook, array(&$a, 'action')); + + // schedule an event for 1 second ago + wp_schedule_event( $timestamp, $recur, $hook, $args ); + $this->assertEquals( $timestamp, wp_next_scheduled($hook, $args) ); + $this->assertEquals( $recur, wp_get_schedule($hook, $args) ); + + // run cron jobs + $this->_do_cron(); + + // our action should have been called once with the correct args + $this->assertEquals( 1, $a->get_call_count() ); + $this->assertEquals( array($args), $a->get_args() ); + + // it should appear in the schedule to run again in an hour's time + $this->assertEquals( $timestamp + 3600, wp_next_scheduled($hook, $args) ); + + } +} +*/ |