mirror of
https://github.com/moodle/moodle.git
synced 2025-01-19 14:27:22 +01:00
83b490a594
Applied the following changes to various testcase classes: - Namespaced with component[\level2-API] - Moved to level2-API subdirectory when required. - Fixed incorrect use statements with leading backslash. - Remove file phpdoc block - Remove MOODLE_INTERNAL if not needed. - Changed code to point to global scope when needed. - Fix some relative paths and comments here and there. - All them passing individually. - Complete runs passing too. Special mention to: - The following task tests have been moved within the level2 directory: - \core\adhoc_task_test => \core\task\adhoc_task_test - \core\scheduled_task_test => \core\task\scheduled_task_test - \core\calendar_cron_task_test => \core\task\calendar_cron_task_test - \core\h5p_get_content_types_task_test => \core\task\h5p_get_content_types_task_test - \core\task_database_logger_test => \core\task\database_logger_test - \core\task_logging_test => \core\task\logging_test - The following event tests have been moved within level2 directory: - \core\event_context_locked_test => \core\event\context_locked_test - \core\event_deprecated_test => \core\event\deprecated_test - \core\event_grade_deleted_test => \core\event\grade_deleted_test - \core\event_profile_field_test => \core\event\profile_field_test - \core\event_unknown_logged_test => \core\event\unknown_logged_test - \core\event_user_graded_test => \core\event\user_graded_test - \core\event_user_password_updated_test => \core\event\user_password_updated_test - The following output tests have been moved within level2 directory: - \core\mustache_template_finder_test => \core\output\mustache_template_finder_test - \core\mustache_template_source_loader_test => \core\output\mustache_template_source_loader_test - \core\output_mustache_helper_collection_test => \core\output\mustache_helper_collection_test - The following tests have been moved to their correct tests directories: - lib/tests/time_splittings_test.php => analytics/tests/time_splittings_test.php - All the classes and tests under lib/filebrowser and lib/filestorage belong to core, not to core_files. Some day we should move them to their correct subsystem. - All the classes and tests under lib/grade belong to core, not to core_grades. Some day we should move them to their correct subsystem. - The core_grades_external class and its \core\grades_external_test unit test should belong to the grades subsystem or, alternatively, to \core\external, they both should be moved together. - The core_grading_external class and its \core\grading_external_test unit test should belong to the grading subsystem or, alternatively, to \core\external, they both should be moved together. - The \core\message\message and \core\message\inbound (may be others) classes, and their associated tests should go to the core_message subsystem. - The core_user class, and its associated tests should go to the core_user subsystem. - The \core\update namespace is plain wrong (update is not valid API) and needs action 1) create it or 2) move elsewhere.
490 lines
20 KiB
PHP
490 lines
20 KiB
PHP
<?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/>.
|
|
|
|
namespace core;
|
|
|
|
use core_media_manager;
|
|
use media_test_plugin;
|
|
|
|
defined('MOODLE_INTERNAL') || die();
|
|
require_once(__DIR__ . '/fixtures/testable_core_media_player.php');
|
|
|
|
/**
|
|
* Test classes for handling embedded media (audio/video).
|
|
*
|
|
* @package core
|
|
* @category test
|
|
* @copyright 2012 The Open University
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
class medialib_test extends \advanced_testcase {
|
|
|
|
/**
|
|
* Pre-test setup. Preserves $CFG.
|
|
*/
|
|
public function setUp(): void {
|
|
parent::setUp();
|
|
|
|
// Reset $CFG and $SERVER.
|
|
$this->resetAfterTest();
|
|
|
|
// "Install" a fake plugin for testing.
|
|
set_config('version', '2016101400', 'media_test');
|
|
|
|
// Consistent initial setup: all players disabled.
|
|
\core\plugininfo\media::set_enabled_plugins('');
|
|
|
|
$_SERVER = array('HTTP_USER_AGENT' => '');
|
|
$this->pretend_to_be_safari();
|
|
}
|
|
|
|
/**
|
|
* Sets user agent to Safari.
|
|
*/
|
|
private function pretend_to_be_safari() {
|
|
// Pretend to be using Safari browser (must support mp4 for tests to work).
|
|
\core_useragent::instance(true, 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) ' .
|
|
'AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1');
|
|
}
|
|
|
|
/**
|
|
* Sets user agent to Firefox.
|
|
*/
|
|
private function pretend_to_be_firefox() {
|
|
// Pretend to be using Firefox browser (must support ogg for tests to work).
|
|
\core_useragent::instance(true, 'Mozilla/5.0 (X11; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0 ');
|
|
}
|
|
|
|
/**
|
|
* Test for core_media::get_filename.
|
|
*/
|
|
public function test_get_filename() {
|
|
$manager = core_media_manager::instance();
|
|
|
|
$this->assertSame('frog.mp4', $manager->get_filename(new \moodle_url(
|
|
'/pluginfile.php/312/mod_page/content/7/frog.mp4')));
|
|
// This should work even though slasharguments is true, because we want
|
|
// it to support 'legacy' links if somebody toggles the option later.
|
|
$this->assertSame('frog.mp4', $manager->get_filename(new \moodle_url(
|
|
'/pluginfile.php?file=/312/mod_page/content/7/frog.mp4')));
|
|
}
|
|
|
|
/**
|
|
* Test for core_media::get_extension.
|
|
*/
|
|
public function test_get_extension() {
|
|
$manager = core_media_manager::instance();
|
|
|
|
$this->assertSame('mp4', $manager->get_extension(new \moodle_url(
|
|
'/pluginfile.php/312/mod_page/content/7/frog.mp4')));
|
|
$this->assertSame('', $manager->get_extension(new \moodle_url(
|
|
'/pluginfile.php/312/mod_page/content/7/frog')));
|
|
$this->assertSame('mp4', $manager->get_extension(new \moodle_url(
|
|
'/pluginfile.php?file=/312/mod_page/content/7/frog.mp4')));
|
|
$this->assertSame('', $manager->get_extension(new \moodle_url(
|
|
'/pluginfile.php?file=/312/mod_page/content/7/frog')));
|
|
}
|
|
|
|
/**
|
|
* Test for the core_media_player list_supported_urls.
|
|
*/
|
|
public function test_list_supported_urls() {
|
|
$test = new media_test_plugin(1, 13, ['tst', 'test']);
|
|
|
|
// Some example URLs.
|
|
$supported1 = new \moodle_url('http://example.org/1.test');
|
|
$supported2 = new \moodle_url('http://example.org/2.TST');
|
|
$unsupported = new \moodle_url('http://example.org/2.jpg');
|
|
|
|
// No URLs => none.
|
|
$result = $test->list_supported_urls(array());
|
|
$this->assertEquals(array(), $result);
|
|
|
|
// One supported URL => same.
|
|
$result = $test->list_supported_urls(array($supported1));
|
|
$this->assertEquals(array($supported1), $result);
|
|
|
|
// Two supported URLS => same.
|
|
$result = $test->list_supported_urls(array($supported1, $supported2));
|
|
$this->assertEquals(array($supported1, $supported2), $result);
|
|
|
|
// One unsupported => none.
|
|
$result = $test->list_supported_urls(array($unsupported));
|
|
$this->assertEquals(array(), $result);
|
|
|
|
// Two supported and one unsupported => same.
|
|
$result = $test->list_supported_urls(array($supported2, $unsupported, $supported1));
|
|
$this->assertEquals(array($supported2, $supported1), $result);
|
|
}
|
|
|
|
/**
|
|
* Test for get_players
|
|
*/
|
|
public function test_get_players() {
|
|
// All players are initially disabled (except link, which you can't).
|
|
$manager = core_media_manager::instance();
|
|
$this->assertEmpty($this->get_players_test($manager));
|
|
|
|
// A couple enabled, check the order.
|
|
\core\plugininfo\media::set_enabled_plugins('youtube,html5audio');
|
|
$manager = core_media_manager::instance();
|
|
$this->assertSame('youtube, html5audio', $this->get_players_test($manager));
|
|
|
|
// Test HTML5 media order.
|
|
\core\plugininfo\media::set_enabled_plugins('html5video,html5audio');
|
|
$manager = core_media_manager::instance();
|
|
$this->assertSame('html5video, html5audio', $this->get_players_test($manager));
|
|
|
|
// Make sure that our test plugin is considered installed.
|
|
\core\plugininfo\media::set_enabled_plugins('test,html5video');
|
|
$manager = core_media_manager::instance();
|
|
$this->assertSame('test, html5video', $this->get_players_test($manager));
|
|
|
|
// Make sure that non-existing plugin is NOT considered installed.
|
|
\core\plugininfo\media::set_enabled_plugins('nonexistingplugin,html5video');
|
|
$manager = core_media_manager::instance();
|
|
$this->assertSame('html5video', $this->get_players_test($manager));
|
|
}
|
|
|
|
/**
|
|
* Test for can_embed_url
|
|
*/
|
|
public function test_can_embed_url() {
|
|
// All players are initially disabled, so mp4 cannot be rendered.
|
|
$url = new \moodle_url('http://example.org/test.mp4');
|
|
$manager = core_media_manager::instance();
|
|
$this->assertFalse($manager->can_embed_url($url));
|
|
|
|
// Enable VideoJS player.
|
|
\core\plugininfo\media::set_enabled_plugins('videojs');
|
|
$manager = core_media_manager::instance();
|
|
$this->assertTrue($manager->can_embed_url($url));
|
|
|
|
// VideoJS + html5.
|
|
\core\plugininfo\media::set_enabled_plugins('videojs,html5video');
|
|
$manager = core_media_manager::instance();
|
|
$this->assertTrue($manager->can_embed_url($url));
|
|
|
|
// Only html5.
|
|
\core\plugininfo\media::set_enabled_plugins('html5video');
|
|
$manager = core_media_manager::instance();
|
|
$this->assertTrue($manager->can_embed_url($url));
|
|
}
|
|
|
|
/**
|
|
* Test for embed_url.
|
|
* Checks multiple format/fallback support.
|
|
*/
|
|
public function test_embed_url_fallbacks() {
|
|
|
|
// Key strings in the embed code that identify with the media formats being tested.
|
|
$html5video = '</video>';
|
|
$html5audio = '</audio>';
|
|
$link = 'mediafallbacklink';
|
|
$test = 'mediaplugin_test';
|
|
|
|
$url = new \moodle_url('http://example.org/test.mp4');
|
|
|
|
// All plugins disabled, NOLINK option.
|
|
\core\plugininfo\media::set_enabled_plugins('');
|
|
$manager = core_media_manager::instance();
|
|
$t = $manager->embed_url($url, 0, 0, '',
|
|
array(core_media_manager::OPTION_NO_LINK => true));
|
|
// Completely empty.
|
|
$this->assertSame('', $t);
|
|
|
|
// All plugins disabled but not NOLINK.
|
|
\core\plugininfo\media::set_enabled_plugins('');
|
|
$manager = core_media_manager::instance();
|
|
$t = $manager->embed_url($url);
|
|
$this->assertStringContainsString($link, $t);
|
|
|
|
// Enable media players that can play the same media formats. (ie. test & html5audio for mp3 files, etc.)
|
|
\core\plugininfo\media::set_enabled_plugins('test,html5video,html5audio');
|
|
$manager = core_media_manager::instance();
|
|
|
|
// Test media formats that can be played by 2 or more players.
|
|
$mediaformats = array('mp3', 'mp4');
|
|
|
|
foreach ($mediaformats as $format) {
|
|
$url = new \moodle_url('http://example.org/test.' . $format);
|
|
$textwithlink = $manager->embed_url($url);
|
|
$textwithoutlink = $manager->embed_url($url, 0, 0, '', array(core_media_manager::OPTION_NO_LINK => true));
|
|
|
|
switch ($format) {
|
|
case 'mp3':
|
|
$this->assertStringContainsString($test, $textwithlink);
|
|
$this->assertStringNotContainsString($html5video, $textwithlink);
|
|
$this->assertStringContainsString($html5audio, $textwithlink);
|
|
$this->assertStringContainsString($link, $textwithlink);
|
|
|
|
$this->assertStringContainsString($test, $textwithoutlink);
|
|
$this->assertStringNotContainsString($html5video, $textwithoutlink);
|
|
$this->assertStringContainsString($html5audio, $textwithoutlink);
|
|
$this->assertStringNotContainsString($link, $textwithoutlink);
|
|
break;
|
|
|
|
case 'mp4':
|
|
$this->assertStringContainsString($test, $textwithlink);
|
|
$this->assertStringContainsString($html5video, $textwithlink);
|
|
$this->assertStringNotContainsString($html5audio, $textwithlink);
|
|
$this->assertStringContainsString($link, $textwithlink);
|
|
|
|
$this->assertStringContainsString($test, $textwithoutlink);
|
|
$this->assertStringContainsString($html5video, $textwithoutlink);
|
|
$this->assertStringNotContainsString($html5audio, $textwithoutlink);
|
|
$this->assertStringNotContainsString($link, $textwithoutlink);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Test for embed_url.
|
|
* SWF shouldn't be converted to objects because media_swf has been removed.
|
|
*/
|
|
public function test_embed_url_swf() {
|
|
$manager = core_media_manager::instance();
|
|
|
|
// Without any options...
|
|
$url = new \moodle_url('http://example.org/test.swf');
|
|
$t = $manager->embed_url($url);
|
|
$this->assertStringNotContainsString('</object>', $t);
|
|
|
|
// ...and with the 'no it's safe, I checked it' option.
|
|
$url = new \moodle_url('http://example.org/test.swf');
|
|
$t = $manager->embed_url($url, '', 0, 0, array(core_media_manager::OPTION_TRUSTED => true));
|
|
$this->assertStringNotContainsString('</object>', $t);
|
|
}
|
|
|
|
/**
|
|
* Same as test_embed_url MP3 test, but for slash arguments.
|
|
*/
|
|
public function test_slash_arguments() {
|
|
|
|
// Again we do not turn slasharguments actually on, because it has to
|
|
// work regardless of the setting of that variable in case of handling
|
|
// links created using previous setting.
|
|
|
|
// Enable player.
|
|
\core\plugininfo\media::set_enabled_plugins('html5audio');
|
|
$manager = core_media_manager::instance();
|
|
|
|
// Format: mp3.
|
|
$url = new \moodle_url('http://example.org/pluginfile.php?file=x/y/z/test.mp3');
|
|
$t = $manager->embed_url($url);
|
|
$this->assertStringContainsString('</audio>', $t);
|
|
}
|
|
|
|
/**
|
|
* Test for embed_url.
|
|
* Checks the EMBED_OR_BLANK option.
|
|
*/
|
|
public function test_embed_or_blank() {
|
|
\core\plugininfo\media::set_enabled_plugins('html5audio');
|
|
$manager = core_media_manager::instance();
|
|
$this->pretend_to_be_firefox();
|
|
|
|
$options = array(core_media_manager::OPTION_FALLBACK_TO_BLANK => true);
|
|
|
|
// Embed that does match something should still include the link too.
|
|
$url = new \moodle_url('http://example.org/test.ogg');
|
|
$t = $manager->embed_url($url, '', 0, 0, $options);
|
|
$this->assertStringContainsString('</audio>', $t);
|
|
$this->assertStringContainsString('mediafallbacklink', $t);
|
|
|
|
// Embed that doesn't match something should be totally blank.
|
|
$url = new \moodle_url('http://example.org/test.mp4');
|
|
$t = $manager->embed_url($url, '', 0, 0, $options);
|
|
$this->assertSame('', $t);
|
|
}
|
|
|
|
/**
|
|
* Test for embed_url.
|
|
* Checks that size is passed through correctly to player objects and tests
|
|
* size support in html5video output.
|
|
*/
|
|
public function test_embed_url_size() {
|
|
global $CFG;
|
|
|
|
// Technically this could break in every format and they handle size
|
|
// in several different ways, but I'm too lazy to test it in every
|
|
// format, so let's just pick one to check the values get passed
|
|
// through.
|
|
\core\plugininfo\media::set_enabled_plugins('html5video');
|
|
$manager = core_media_manager::instance();
|
|
$url = new \moodle_url('http://example.org/test.mp4');
|
|
|
|
// HTML5 default size - specifies core width and does not specify height.
|
|
$t = $manager->embed_url($url);
|
|
$this->assertStringContainsString('width="' . $CFG->media_default_width . '"', $t);
|
|
$this->assertStringNotContainsString('height', $t);
|
|
|
|
// HTML5 specified size - specifies both.
|
|
$t = $manager->embed_url($url, '', '666', '101');
|
|
$this->assertStringContainsString('width="666"', $t);
|
|
$this->assertStringContainsString('height="101"', $t);
|
|
|
|
// HTML5 size specified in url, overrides call.
|
|
$url = new \moodle_url('http://example.org/test.mp4?d=123x456');
|
|
$t = $manager->embed_url($url, '', '666', '101');
|
|
$this->assertStringContainsString('width="123"', $t);
|
|
$this->assertStringContainsString('height="456"', $t);
|
|
}
|
|
|
|
/**
|
|
* Test for embed_url.
|
|
* Checks that name is passed through correctly to player objects and tests
|
|
* name support in html5video output.
|
|
*/
|
|
public function test_embed_url_name() {
|
|
// As for size this could break in every format but I'm only testing
|
|
// html5video.
|
|
\core\plugininfo\media::set_enabled_plugins('html5video');
|
|
$manager = core_media_manager::instance();
|
|
$url = new \moodle_url('http://example.org/test.mp4');
|
|
|
|
// HTML5 default name - use filename.
|
|
$t = $manager->embed_url($url);
|
|
$this->assertStringContainsString('title="test.mp4"', $t);
|
|
|
|
// HTML5 specified name - check escaping.
|
|
$t = $manager->embed_url($url, 'frog & toad');
|
|
$this->assertStringContainsString('title="frog & toad"', $t);
|
|
}
|
|
|
|
/**
|
|
* Test for split_alternatives.
|
|
*/
|
|
public function test_split_alternatives() {
|
|
$mediamanager = core_media_manager::instance();
|
|
|
|
// Single URL - identical moodle_url.
|
|
$mp4 = 'http://example.org/test.mp4';
|
|
$result = $mediamanager->split_alternatives($mp4, $w, $h);
|
|
$this->assertEquals($mp4, $result[0]->out(false));
|
|
|
|
// Width and height weren't specified.
|
|
$this->assertEquals(0, $w);
|
|
$this->assertEquals(0, $h);
|
|
|
|
// Two URLs - identical moodle_urls.
|
|
$webm = 'http://example.org/test.webm';
|
|
$result = $mediamanager->split_alternatives("$mp4#$webm", $w, $h);
|
|
$this->assertEquals($mp4, $result[0]->out(false));
|
|
$this->assertEquals($webm, $result[1]->out(false));
|
|
|
|
// Two URLs plus dimensions.
|
|
$size = 'd=400x280';
|
|
$result = $mediamanager->split_alternatives("$mp4#$webm#$size", $w, $h);
|
|
$this->assertEquals($mp4, $result[0]->out(false));
|
|
$this->assertEquals($webm, $result[1]->out(false));
|
|
$this->assertEquals(400, $w);
|
|
$this->assertEquals(280, $h);
|
|
|
|
// Two URLs plus legacy dimensions (use last one).
|
|
$result = $mediamanager->split_alternatives("$mp4?d=1x1#$webm?$size", $w, $h);
|
|
$this->assertEquals($mp4, $result[0]->out(false));
|
|
$this->assertEquals($webm, $result[1]->out(false));
|
|
$this->assertEquals(400, $w);
|
|
$this->assertEquals(280, $h);
|
|
}
|
|
|
|
/**
|
|
* Test for embed_alternatives (with multiple urls)
|
|
*/
|
|
public function test_embed_alternatives() {
|
|
// Most aspects of this are same as single player so let's just try
|
|
// a single typical / complicated scenario.
|
|
|
|
// MP4, OGV, WebM and FLV.
|
|
$urls = array(
|
|
new \moodle_url('http://example.org/test.mp4'),
|
|
new \moodle_url('http://example.org/test.ogv'),
|
|
new \moodle_url('http://example.org/test.webm'),
|
|
new \moodle_url('http://example.org/test.flv'),
|
|
);
|
|
|
|
// Enable html5 and "test" ("test" first).
|
|
\core\plugininfo\media::set_enabled_plugins('test,html5video');
|
|
$manager = core_media_manager::instance();
|
|
|
|
// Result should contain HTML5 with two sources + FLV.
|
|
$t = $manager->embed_alternatives($urls);
|
|
|
|
// HTML5 sources - mp4, but not ogv, flv or webm (not supported in Safari).
|
|
$this->assertStringContainsString('<source src="http://example.org/test.mp4"', $t);
|
|
$this->assertStringNotContainsString('<source src="http://example.org/test.ogv"', $t);
|
|
$this->assertStringNotContainsString('<source src="http://example.org/test.webm"', $t);
|
|
$this->assertStringNotContainsString('<source src="http://example.org/test.flv"', $t);
|
|
|
|
// FLV is before the video tag (indicating html5 is used as fallback to flv
|
|
// and not vice versa).
|
|
$this->assertTrue((bool)preg_match('~mediaplugin_test.*<video~s', $t));
|
|
|
|
// Do same test with firefox and check we get the webm and not mp4.
|
|
$this->pretend_to_be_firefox();
|
|
$t = $manager->embed_alternatives($urls);
|
|
|
|
// HTML5 sources - mp4, ogv and webm, but not flv.
|
|
$this->assertStringContainsString('<source src="http://example.org/test.mp4"', $t);
|
|
$this->assertStringContainsString('<source src="http://example.org/test.ogv"', $t);
|
|
$this->assertStringContainsString('<source src="http://example.org/test.webm"', $t);
|
|
$this->assertStringNotContainsString('<source src="http://example.org/test.flv"', $t);
|
|
}
|
|
|
|
/**
|
|
* Make sure the instance() method returns singleton for the same page and different object for another page
|
|
*/
|
|
public function test_initialise() {
|
|
$moodlepage1 = new \moodle_page();
|
|
|
|
$mediamanager1 = core_media_manager::instance($moodlepage1);
|
|
$mediamanager2 = core_media_manager::instance($moodlepage1);
|
|
|
|
$this->assertSame($mediamanager1, $mediamanager2);
|
|
|
|
$moodlepage3 = new \moodle_page();
|
|
$mediamanager3 = core_media_manager::instance($moodlepage3);
|
|
|
|
$this->assertNotSame($mediamanager1, $mediamanager3);
|
|
}
|
|
|
|
|
|
/**
|
|
* Access list of players as string, shortening it by getting rid of
|
|
* repeated text.
|
|
* @param core_media_manager $manager The core_media_manager instance
|
|
* @return string Comma-separated list of players
|
|
*/
|
|
public function get_players_test($manager) {
|
|
$method = new \ReflectionMethod("core_media_manager", "get_players");
|
|
$method->setAccessible(true);
|
|
$players = $method->invoke($manager);
|
|
$out = '';
|
|
foreach ($players as $player) {
|
|
if ($out) {
|
|
$out .= ', ';
|
|
}
|
|
$out .= str_replace('core_media_player_', '', preg_replace('/^media_(.*)_plugin$/', '$1', get_class($player)));
|
|
}
|
|
return $out;
|
|
}
|
|
}
|