summaryrefslogtreecommitdiffstatshomepage
path: root/tests/phpunit/tests/cron.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/phpunit/tests/cron.php')
-rw-r--r--tests/phpunit/tests/cron.php310
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) );
+
+ }
+}
+*/