AutorÃa | 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/>./*** Subplugin test helper trait** @package mod_bigbluebuttonbn* @copyright 2023 - present, Blindside Networks Inc* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later* @author Laurent David (laurent@call-learning.fr)*/namespace mod_bigbluebuttonbn\test;use core_component;use core_h5p\core;use core_plugin_manager;use mod_bigbluebuttonbn\extension;use ReflectionClass;trait subplugins_test_helper_trait {/*** Setup a fake extension plugin** This is intended to behave in most case like a real subplugina and will* allow most functionalities to be tested.** @param string $pluginname plugin name* @return void*/protected function setup_fake_plugin(string $pluginname): void {global $CFG;require_once("$CFG->libdir/upgradelib.php");$bbbextpath = "{$CFG->dirroot}/mod/bigbluebuttonbn/tests/fixtures/extension";// This is similar to accesslib_test::setup_fake_plugin.$mockedcomponent = new ReflectionClass(core_component::class);$mockedplugins = $mockedcomponent->getProperty('plugins');$plugins = $mockedplugins->getValue();$plugins[extension::BBB_EXTENSION_PLUGIN_NAME] = [$pluginname => $bbbextpath . "/$pluginname"];$mockedplugins->setValue(null, $plugins);$mockedplugintypes = $mockedcomponent->getProperty('plugintypes');$pluginstypes = $mockedplugintypes->getValue();$pluginstypes[extension::BBB_EXTENSION_PLUGIN_NAME] = $bbbextpath;$mockedplugintypes->setValue(null, $pluginstypes);$fillclassmap = $mockedcomponent->getMethod('fill_classmap_cache');$fillclassmap->invoke(null);$fillfilemap = $mockedcomponent->getMethod('fill_filemap_cache');$fillfilemap->invoke(null);$mockedsubplugins = $mockedcomponent->getProperty('subplugins');$subplugins = $mockedsubplugins->getValue();$subplugins['mod_bigbluebuttonbn'][extension::BBB_EXTENSION_PLUGIN_NAME][] = $pluginname;$mockedsubplugins->setValue(null, $subplugins);// Now write the content of the cache in a file so we can use it later.$content = core_component::get_cache_content();self::write_fake_component_cache($content);// Make sure the plugin is installed.ob_start();upgrade_noncore(false);upgrade_finished();ob_end_clean();// Cache has been cleared so let's write it again.self::write_fake_component_cache($content);}/*** Write the content of the cache in a file for later use.** This is used exclusively in behat test as the cache is filled with new values at each session/page load.** @param string $content content of the cache* @return void*/protected function write_fake_component_cache($content) {global $CFG;$cachefile = "$CFG->cachedir/core_component.php";if (file_exists($cachefile)) {// Stale cache detected!unlink($cachefile);}// Permissions might not be setup properly in installers.$dirpermissions = !isset($CFG->directorypermissions) ? 02777 : $CFG->directorypermissions;$filepermissions = !isset($CFG->filepermissions) ? ($dirpermissions & 0666) : $CFG->filepermissions;clearstatcache();$cachedir = dirname($cachefile);if (!is_dir($cachedir)) {mkdir($cachedir, $dirpermissions, true);}if ($fp = @fopen($cachefile . '.tmp', 'xb')) {fwrite($fp, $content);fclose($fp);@rename($cachefile . '.tmp', $cachefile);@chmod($cachefile, $filepermissions);}@unlink($cachefile . '.tmp'); // Just in case anything fails (race condition).core_component::invalidate_opcode_php_cache($cachefile);}/*** Uninstall a fake extension plugin** This is intended to behave in most case like a real subplugina and will* allow most functionalities to be tested.** @param string $pluginname plugin name* @return void*/protected function uninstall_fake_plugin(string $pluginname): void {global $CFG;require_once("$CFG->libdir/adminlib.php");// We just need access to fill_all_caches so everything goes back to normal.// If we don't do this, there are some side effects that will make other test fails// (such as mod_bigbluebuttonbn\task\upgrade_recordings_task_test::test_upgrade_recordings_imported_basic).$cachefile = "$CFG->cachedir/core_component.php";if (file_exists($cachefile)) {// Stale cache detected!unlink($cachefile);}$mockedcomponent = new ReflectionClass(core_component::class);// Here we reset the plugin caches.$mockedplugintypes = $mockedcomponent->getProperty('plugintypes');$mockedplugintypes->setValue(null, null);$fillclassmap = $mockedcomponent->getMethod('init');$fillclassmap->invoke(null);// Now uninstall the plugin and clean everything up for other tests.$pluginman = core_plugin_manager::instance();$plugininfo = $pluginman->get_plugins();foreach ($plugininfo as $type => $plugins) {foreach ($plugins as $name => $plugin) {if ($name === $pluginname) {ob_start();uninstall_plugin($type, $name);ob_end_clean();}}}}}