Rev 1 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?php// This file is part of Moodle - http://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <http://www.gnu.org/licenses/>./*** @package core_backup* @category test* @copyright 2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/namespace core_backup;use backup;use backup_controller;use backup_controller_dbops;use backup_controller_exception;use backup_dbops_exception;defined('MOODLE_INTERNAL') || die();// Include all the needed stuffglobal $CFG;require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php');/*** @package core_backup* @category test* @copyright 2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/class backup_dbops_test extends \advanced_testcase {protected $moduleid; // course_modules id used for testingprotected $sectionid; // course_sections id used for testingprotected $courseid; // course id used for testingprotected $userid; // user record used for testingprotected function setUp(): void {global $DB, $CFG;parent::setUp();$this->resetAfterTest(true);$course = $this->getDataGenerator()->create_course();$page = $this->getDataGenerator()->create_module('page', array('course'=>$course->id), array('section'=>3));$coursemodule = $DB->get_record('course_modules', array('id'=>$page->cmid));$this->moduleid = $page->cmid;$this->sectionid = $DB->get_field("course_sections", 'id', array("section"=>$coursemodule->section, "course"=>$course->id));$this->courseid = $coursemodule->course;$this->userid = 2; // admin$CFG->backup_error_log_logger_level = backup::LOG_NONE;$CFG->backup_output_indented_logger_level = backup::LOG_NONE;$CFG->backup_file_logger_level = backup::LOG_NONE;$CFG->backup_database_logger_level = backup::LOG_NONE;unset($CFG->backup_file_logger_extra);$CFG->backup_file_logger_level_extra = backup::LOG_NONE;}/** test backup_ops class*/function test_backup_dbops(): void {// Nothing to do here, abstract class + exception, will be tested by the rest}/** test backup_controller_dbops class*/function test_backup_controller_dbops(): void {global $DB;$dbman = $DB->get_manager(); // Going to use some database_manager services for testing// Instantiate non interactive backup_controller$bc = new mock_backup_controller4dbops(backup::TYPE_1ACTIVITY, $this->moduleid, backup::FORMAT_MOODLE,backup::INTERACTIVE_NO, backup::MODE_GENERAL, $this->userid);$this->assertTrue($bc instanceof backup_controller);// Calculate checksum$checksum = $bc->calculate_checksum();$this->assertEquals(strlen($checksum), 32); // is one md5// save controller$recid = backup_controller_dbops::save_controller($bc, $checksum);$this->assertNotEmpty($recid);// save it again (should cause update to happen)$recid2 = backup_controller_dbops::save_controller($bc, $checksum);$this->assertNotEmpty($recid2);$this->assertEquals($recid, $recid2); // Same record in both save operations// Try incorrect checksum$bc = new mock_backup_controller4dbops(backup::TYPE_1ACTIVITY, $this->moduleid, backup::FORMAT_MOODLE,backup::INTERACTIVE_NO, backup::MODE_GENERAL, $this->userid);$checksum = $bc->calculate_checksum();try {$recid = backup_controller_dbops::save_controller($bc, 'lalala');$this->assertTrue(false, 'backup_dbops_exception expected');} catch (\Exception $e) {$this->assertTrue($e instanceof backup_dbops_exception);$this->assertEquals($e->errorcode, 'backup_controller_dbops_saving_checksum_mismatch');}// Try to save non backup_controller object$bc = new \stdClass();try {$recid = backup_controller_dbops::save_controller($bc, 'lalala');$this->assertTrue(false, 'backup_controller_exception expected');} catch (\Exception $e) {$this->assertTrue($e instanceof backup_controller_exception);$this->assertEquals($e->errorcode, 'backup_controller_expected');}// save and load controller (by backupid). Then compare$bc = new mock_backup_controller4dbops(backup::TYPE_1ACTIVITY, $this->moduleid, backup::FORMAT_MOODLE,backup::INTERACTIVE_NO, backup::MODE_GENERAL, $this->userid);$checksum = $bc->calculate_checksum(); // Calculate checksum$backupid = $bc->get_backupid();$this->assertEquals(strlen($backupid), 32); // is one md5$recid = backup_controller_dbops::save_controller($bc, $checksum); // save controller$newbc = backup_controller_dbops::load_controller($backupid); // load controller$this->assertTrue($newbc instanceof backup_controller);$newchecksum = $newbc->calculate_checksum();$this->assertEquals($newchecksum, $checksum);// try to load non-existing controllertry {$bc = backup_controller_dbops::load_controller('1234567890');$this->assertTrue(false, 'backup_dbops_exception expected');} catch (\Exception $e) {$this->assertTrue($e instanceof backup_dbops_exception);$this->assertEquals($e->errorcode, 'backup_controller_dbops_nonexisting');}// backup_ids_temp table tests// If, for any reason table exists, drop itif ($dbman->table_exists('backup_ids_temp')) {$dbman->drop_table(new xmldb_table('backup_ids_temp'));}// Check backup_ids_temp table doesn't exist$this->assertFalse($dbman->table_exists('backup_ids_temp'));// Create and check it existsbackup_controller_dbops::create_backup_ids_temp_table('testingid');$this->assertTrue($dbman->table_exists('backup_ids_temp'));// Drop and check it doesn't exists anymorebackup_controller_dbops::drop_backup_ids_temp_table('testingid');$this->assertFalse($dbman->table_exists('backup_ids_temp'));// Test encoding/decoding of backup_ids_temp,backup_files_temp encode/decode functions.// We need to handle both objects and data elements.$object = new \stdClass();$object->item1 = 10;$object->item2 = 'a String';$testarray = array($object, 10, null, 'string', array('a' => 'b', 1 => 1));foreach ($testarray as $item) {$encoded = backup_controller_dbops::encode_backup_temp_info($item);$decoded = backup_controller_dbops::decode_backup_temp_info($encoded);$this->assertEquals($item, $decoded);}}/*** Check backup_includes_files*/function test_backup_controller_dbops_includes_files(): void {global $DB;$dbman = $DB->get_manager(); // Going to use some database_manager services for testing// A MODE_GENERAL controller - this should include files$bc = new mock_backup_controller4dbops(backup::TYPE_1ACTIVITY, $this->moduleid, backup::FORMAT_MOODLE,backup::INTERACTIVE_NO, backup::MODE_GENERAL, $this->userid);$this->assertEquals(backup_controller_dbops::backup_includes_files($bc->get_backupid()), 1);// A MODE_IMPORT controller - should not include files$bc = new mock_backup_controller4dbops(backup::TYPE_1ACTIVITY, $this->moduleid, backup::FORMAT_MOODLE,backup::INTERACTIVE_NO, backup::MODE_IMPORT, $this->userid);$this->assertEquals(backup_controller_dbops::backup_includes_files($bc->get_backupid()), 0);// A MODE_SAMESITE controller - should not include files$bc = new mock_backup_controller4dbops(backup::TYPE_1COURSE, $this->courseid, backup::FORMAT_MOODLE,backup::INTERACTIVE_NO, backup::MODE_SAMESITE, $this->userid);$this->assertEquals(backup_controller_dbops::backup_includes_files($bc->get_backupid()), 0);}}class mock_backup_controller4dbops extends backup_controller {/*** Change standard behavior so the checksum is also stored and not onlt calculated*/public function calculate_checksum() {$this->checksum = parent::calculate_checksum();return $this->checksum;}}