Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.

Differences Between: [Versions 310 and 311] [Versions 310 and 400] [Versions 310 and 401] [Versions 310 and 402] [Versions 310 and 403] [Versions 39 and 310]

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * Unit tests for plugin base class.
  19   *
  20   * @package   core
  21   * @copyright 2019 Andrew Nicols
  22   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  declare(strict_types = 1);
  26  namespace core\plugininfo;
  27  
  28  defined('MOODLE_INTERNAL') || die();
  29  
  30  use core_plugin_manager;
  31  use testable_core_plugin_manager;
  32  use testable_plugininfo_base;
  33  
  34  
  35  /**
  36   * Tests of the basic API of the plugin manager.
  37   */
  38  class base_testcase extends \advanced_testcase {
  39  
  40      /**
  41       * Setup to ensure that fixtures are loaded.
  42       */
  43      public static function setUpBeforeClass(): void {
  44          global $CFG;
  45  
  46          require_once($CFG->dirroot.'/lib/tests/fixtures/testable_plugin_manager.php');
  47          require_once($CFG->dirroot.'/lib/tests/fixtures/testable_plugininfo_base.php');
  48      }
  49  
  50      /**
  51       * Tear down the testable plugin manager singleton between tests.
  52       */
  53      public function tearDown(): void {
  54          // The caches of the testable singleton must be reset explicitly. It is
  55          // safer to kill the whole testable singleton at the end of every test.
  56          testable_core_plugin_manager::reset_caches();
  57      }
  58  
  59      /**
  60       * Test the load_disk_version function to check that it handles a variety of invalid supported fields.
  61       *
  62       * @dataProvider load_disk_version_invalid_supported_version_provider
  63       * @param array|null $supported Supported versions to inject
  64       * @param string|int|null $incompatible Incompatible version to inject.
  65       * @param int $version Version to test
  66       */
  67      public function test_load_disk_version_invalid_supported_version($supported, $incompatible, $version): void {
  68          $pluginman = testable_core_plugin_manager::instance();
  69  
  70          // Prepare a fake plugininfo instance.
  71          $plugininfo = new testable_plugininfo_base();
  72          $plugininfo->type = 'fake';
  73          $plugininfo->typerootdir = '/dev/null';
  74          $plugininfo->name = 'example';
  75          $plugininfo->rootdir = '/dev/null/fake';
  76          $plugininfo->pluginman = $pluginman;
  77          $plugininfo->versiondisk = 2015060600;
  78          $plugininfo->supported = $supported;
  79          $plugininfo->incompatible = $incompatible;
  80  
  81          $pluginman->add_fake_plugin_info($plugininfo);
  82  
  83          $this->expectException(\coding_exception::class);
  84          $this->expectExceptionMessage('Incorrect syntax in plugin supported declaration in example');
  85          $plugininfo->load_disk_version();
  86      }
  87  
  88      /**
  89       * Data provider for the load_disk_version tests for testing with invalid supported fields.
  90       *
  91       * @return array
  92       */
  93      public function load_disk_version_invalid_supported_version_provider(): array {
  94          return [
  95              'Invalid supported range.' => [
  96                  'supported' => [31, 29],
  97                  'incompatible' => null,
  98                  'version' => 32,
  99              ],
 100              'Explicit list, low' => [
 101                  'supported' => [29, 30, 31, 32],
 102                  'incompatible' => null,
 103                  'version' => 28,
 104              ],
 105              'Explicit list, high' => [
 106                  'supported' => [29, 30, 31, 32],
 107                  'incompatible' => null,
 108                  'version' => 33,
 109              ],
 110              'Explicit list, in list' => [
 111                  'supported' => [29, 30, 31, 32, 33],
 112                  'incompatible' => null,
 113                  'version' => 31,
 114              ],
 115              'Explicit list, missing value, unsupported' => [
 116                  'supported' => [29, 30, 32],
 117                  'incompatible' => null,
 118                  'version' => 31,
 119              ],
 120              'Explicit list, missing value, supported' => [
 121                  'supported' => [29, 30, 32],
 122                  'incompatible' => null,
 123                  'version' => 30,
 124              ],
 125          ];
 126      }
 127  
 128      /**
 129       * Test the load_disk_version function to check that it handles a variety of invalid incompatible fields.
 130       *
 131       * @dataProvider load_disk_version_invalid_incompatible_version_provider
 132       * @param mixed $incompatible
 133       */
 134      public function test_load_disk_version_invalid_incompatible_version($incompatible): void {
 135          $pluginman = testable_core_plugin_manager::instance();
 136  
 137          // Prepare a fake plugininfo instance.
 138          $plugininfo = new testable_plugininfo_base();
 139          $plugininfo->type = 'fake';
 140          $plugininfo->typerootdir = '/dev/null';
 141          $plugininfo->name = 'example';
 142          $plugininfo->rootdir = '/dev/null/fake';
 143          $plugininfo->pluginman = $pluginman;
 144          $plugininfo->versiondisk = 2015060600;
 145          $plugininfo->incompatible = $incompatible;
 146  
 147          $pluginman->add_fake_plugin_info($plugininfo);
 148  
 149          $this->expectException(\coding_exception::class);
 150          $this->expectExceptionMessage('Incorrect syntax in plugin incompatible declaration in example');
 151          $plugininfo->load_disk_version();
 152      }
 153  
 154      /**
 155       * Data provider for the load_disk_version tests for testing with invalid incompatible fields.
 156       *
 157       * @return array
 158       */
 159      public function load_disk_version_invalid_incompatible_version_provider(): array {
 160          return [
 161              [[38]],
 162              [['38']],
 163              [3.8],
 164              ['3.8'],
 165              [''],
 166              ['somestring'],
 167          ];
 168  
 169      }
 170  
 171      /**
 172       * Test the load_disk_version function to check that it handles a range of correct supported and incompatible field
 173       * definitions.
 174       *
 175       * @dataProvider test_load_disk_version_branch_supports_provider
 176       * @param array|null $supported Supported versions to inject
 177       * @param string|int|null $incompatible Incompatible version to inject.
 178       * @param int $version Version to test
 179       */
 180      public function test_load_disk_version_branch_supports($supported, $incompatible, $version): void {
 181          $pluginman = testable_core_plugin_manager::instance();
 182  
 183          // Prepare a fake plugininfo instance.
 184          $plugininfo = new testable_plugininfo_base();
 185          $plugininfo->type = 'fake';
 186          $plugininfo->typerootdir = '/dev/null';
 187          $plugininfo->name = 'example';
 188          $plugininfo->rootdir = '/dev/null/fake';
 189          $plugininfo->pluginman = $pluginman;
 190          $plugininfo->versiondisk = 2015060600;
 191          $plugininfo->supported = $supported;
 192          $plugininfo->incompatible = $incompatible;
 193  
 194          $pluginman->add_fake_plugin_info($plugininfo);
 195  
 196          $plugininfo->load_disk_version();
 197  
 198          $this->assertEquals($supported, $plugininfo->supported);
 199          $this->assertEquals($incompatible, $plugininfo->incompatible);
 200      }
 201  
 202      /**
 203       * Test cases for tests of load_disk_version for testing the supported/incompatible fields.
 204       *
 205       * @return array
 206       */
 207      public function test_load_disk_version_branch_supports_provider(): array {
 208          return [
 209              'Range, branch in support, lowest' => [
 210                  'supported' => [29, 31],
 211                  'incompatible' => null,
 212                  'version' => 29,
 213              ],
 214              'Range, branch in support, mid' => [
 215                  'supported' => [29, 31],
 216                  'incompatible' => null,
 217                  'version' => 30,
 218              ],
 219              'Range, branch in support, highest' => [
 220                  'supported' => [29, 31],
 221                  'incompatible' => null,
 222                  'version' => 31,
 223              ],
 224  
 225              'Range, branch not in support, high' => [
 226                  'supported' => [29, 31],
 227                  'incompatible' => null,
 228                  'version' => 32,
 229              ],
 230              'Range, branch not in support, low' => [
 231                  'supported' => [29, 31],
 232                  'incompatible' => null,
 233                  'version' => 28,
 234              ],
 235              'Range, incompatible, high.' => [
 236                  'supported' => [29, 31],
 237                  'incompatible' => 32,
 238                  'version' => 33,
 239              ],
 240              'Range, incompatible, low.' => [
 241                  'supported' => [29, 31],
 242                  'incompatible' => 32,
 243                  'version' => 31,
 244              ],
 245              'Range, incompatible, equal.' => [
 246                  'supported' => [29, 31],
 247                  'incompatible' => 32,
 248                  'version' => 32,
 249              ],
 250              'No supports' => [
 251                  'supported' => null,
 252                  'incompatible' => null,
 253                  'version' => 32,
 254              ],
 255              'No supports, but incompatible, older' => [
 256                  'supported' => null,
 257                  'incompatible' => 30,
 258                  'version' => 32,
 259              ],
 260              'No supports, but incompatible, equal' => [
 261                  'supported' => null,
 262                  'incompatible' => 32,
 263                  'version' => 32,
 264              ],
 265              'No supports, but incompatible, newer' => [
 266                  'supported' => null,
 267                  'incompatible' => 34,
 268                  'version' => 32,
 269              ],
 270              'String incompatible' => [
 271                  'supported' => null,
 272                  'incompatible' => '34',
 273                  'version' => 32,
 274              ],
 275              'Empty incompatible' => [
 276                  'supported' => null,
 277                  'incompatible' => null,
 278                  'version' => 32,
 279              ],
 280          ];
 281      }
 282  }