From d4a49ba291079ce9cbcf51a66a05ea853ad25f41 Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Thu, 28 Jun 2012 09:32:13 +0800 Subject: [PATCH 1/2] MDL-29470 Backup: fixed unexpected next automated backup date --- .../util/helper/backup_cron_helper.class.php | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/backup/util/helper/backup_cron_helper.class.php b/backup/util/helper/backup_cron_helper.class.php index 65e56ee2620..00db13dc390 100644 --- a/backup/util/helper/backup_cron_helper.class.php +++ b/backup/util/helper/backup_cron_helper.class.php @@ -281,23 +281,25 @@ abstract class backup_cron_automated_helper { $midnight = usergetmidnight($now, $timezone); $date = usergetdate($now, $timezone); - //Get number of days (from today) to execute backups - $automateddays = substr($config->backup_auto_weekdays,$date['wday']) . $config->backup_auto_weekdays; - $daysfromtoday = strpos($automateddays, "1"); + // Get number of days (from today) to execute backups + $automateddays = substr($config->backup_auto_weekdays, $date['wday']) . $config->backup_auto_weekdays; + $daysfromtoday = strpos($automateddays, "1", 1); + + // If we can't find the next day, we set it to tomorrow if (empty($daysfromtoday)) { $daysfromtoday = 1; } - //If some day has been found + // If some day has been found if ($daysfromtoday !== false) { - //Calculate distance - $dist = ($daysfromtoday * 86400) + //Days distance - ($config->backup_auto_hour * 3600) + //Hours distance - ($config->backup_auto_minute * 60); //Minutes distance + // Calculate distance + $dist = ($daysfromtoday * 86400) + // Days distance + ($config->backup_auto_hour * 3600) + // Hours distance + ($config->backup_auto_minute * 60); // Minutes distance $result = $midnight + $dist; } - //If that time is past, call the function recursively to obtain the next valid day + // If that time is past, call the function recursively to obtain the next valid day if ($result > 0 && $result < time()) { $result = self::calculate_next_automated_backup($timezone, $result); } From 248910258bc04027b4e9e8bbb86d0162341143f4 Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Thu, 28 Jun 2012 09:32:47 +0800 Subject: [PATCH 2/2] MDL-29470 Backup: unit tests for next automated backup date --- lib/tests/backup_test.php | 184 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 lib/tests/backup_test.php diff --git a/lib/tests/backup_test.php b/lib/tests/backup_test.php new file mode 100644 index 00000000000..1830f56dce0 --- /dev/null +++ b/lib/tests/backup_test.php @@ -0,0 +1,184 @@ +. + +/** + * Unit tests for backups. + * + * @package core + * @category phpunit + * @copyright 2012 Frédéric Massart + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once($CFG->dirroot . '/backup/util/helper/backup_cron_helper.class.php'); + +/** + * Unit tests for backup system + */ +class backup_testcase extends advanced_testcase { + + public function test_next_automated_backup() { + + $this->resetAfterTest(); + $admin = get_admin(); + $timezone = $admin->timezone; + + // Notes + // - The next automated backup will never be on the same date than $now + // - backup_auto_weekdays starts on Sunday + // - Tests cannot be done in the past. + + // Every Wed and Sat at 11pm. + set_config('backup_auto_active', '1', 'backup'); + set_config('backup_auto_weekdays', '0010010', 'backup'); + set_config('backup_auto_hour', '23', 'backup'); + set_config('backup_auto_minute', '0', 'backup'); + + $now = strtotime('next Monday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('2-23:00', date('w-H:i', $next)); + + $now = strtotime('next Tuesday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('5-23:00', date('w-H:i', $next)); + + $now = strtotime('next Wednesday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('5-23:00', date('w-H:i', $next)); + + $now = strtotime('next Thursday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('5-23:00', date('w-H:i', $next)); + + $now = strtotime('next Friday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('2-23:00', date('w-H:i', $next)); + + $now = strtotime('next Saturday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('2-23:00', date('w-H:i', $next)); + + $now = strtotime('next Sunday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('2-23:00', date('w-H:i', $next)); + + // Every Sun and Sat at 12pm. + set_config('backup_auto_active', '1', 'backup'); + set_config('backup_auto_weekdays', '1000001', 'backup'); + set_config('backup_auto_hour', '0', 'backup'); + set_config('backup_auto_minute', '0', 'backup'); + + $now = strtotime('next Monday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('6-00:00', date('w-H:i', $next)); + + $now = strtotime('next Tuesday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('6-00:00', date('w-H:i', $next)); + + $now = strtotime('next Wednesday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('6-00:00', date('w-H:i', $next)); + + $now = strtotime('next Thursday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('6-00:00', date('w-H:i', $next)); + + $now = strtotime('next Friday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('6-00:00', date('w-H:i', $next)); + + $now = strtotime('next Saturday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('0-00:00', date('w-H:i', $next)); + + $now = strtotime('next Sunday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('6-00:00', date('w-H:i', $next)); + + // Every Sun at 4am. + set_config('backup_auto_active', '1', 'backup'); + set_config('backup_auto_weekdays', '1000000', 'backup'); + set_config('backup_auto_hour', '4', 'backup'); + set_config('backup_auto_minute', '0', 'backup'); + + $now = strtotime('next Monday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('0-04:00', date('w-H:i', $next)); + + $now = strtotime('next Tuesday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('0-04:00', date('w-H:i', $next)); + + $now = strtotime('next Wednesday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('0-04:00', date('w-H:i', $next)); + + $now = strtotime('next Thursday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('0-04:00', date('w-H:i', $next)); + + $now = strtotime('next Friday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('0-04:00', date('w-H:i', $next)); + + $now = strtotime('next Saturday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('0-04:00', date('w-H:i', $next)); + + $now = strtotime('next Sunday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('0-04:00', date('w-H:i', $next)); + + // Every day but Wed at 8:30pm. + set_config('backup_auto_active', '1', 'backup'); + set_config('backup_auto_weekdays', '1110111', 'backup'); + set_config('backup_auto_hour', '20', 'backup'); + set_config('backup_auto_minute', '30', 'backup'); + + $now = strtotime('next Monday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('2-20:30', date('w-H:i', $next)); + + $now = strtotime('next Tuesday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('4-20:30', date('w-H:i', $next)); + + $now = strtotime('next Wednesday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('4-20:30', date('w-H:i', $next)); + + $now = strtotime('next Thursday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('5-20:30', date('w-H:i', $next)); + + $now = strtotime('next Friday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('6-20:30', date('w-H:i', $next)); + + $now = strtotime('next Saturday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('0-20:30', date('w-H:i', $next)); + + $now = strtotime('next Sunday'); + $next = backup_cron_automated_helper::calculate_next_automated_backup($timezone, $now); + $this->assertEquals('1-20:30', date('w-H:i', $next)); + + } +}