diff --git a/lib/classes/progress/display.php b/lib/classes/progress/display.php index b7974bc0b56..317e57ce647 100644 --- a/lib/classes/progress/display.php +++ b/lib/classes/progress/display.php @@ -38,7 +38,7 @@ class display extends base { */ private $bar; - private $lastwibble, $currentstate = 0, $direction = 1; + protected $lastwibble, $currentstate = 0, $direction = 1; /** * @var bool True to display names @@ -127,6 +127,12 @@ class display extends base { $this->currentstate += 2 * $this->direction; } $buffersize = ini_get('output_buffering'); + if (!is_numeric($buffersize)) { + // The output_buffering setting can be a number, but can also be "On" or "Off". + // If "Off", there's no buffer, if "On", there's no limit to the size. In either case, + // there's no point in trying to fill the buffer. + $buffersize = 0; + } if ($buffersize) { // Force the buffer full. echo str_pad('', $buffersize); diff --git a/lib/tests/progress_display_test.php b/lib/tests/progress_display_test.php new file mode 100644 index 00000000000..8da0e781ded --- /dev/null +++ b/lib/tests/progress_display_test.php @@ -0,0 +1,104 @@ +. +/** + * + * + * @package + * @copyright 2016 The Open University + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +class progress_display_test extends \advanced_testcase { + + /** + * Test basic function of progress_display, updating status and outputting wibbler. + */ + public function test_progress_display_update() { + ob_start(); + $progress = new core_mock_progress_display(); + $progress->start_progress(''); + $this->assertEquals(1, $progress->get_current_state()); + $this->assertEquals(1, $progress->get_direction()); + $this->assertTimeCurrent($progress->get_last_wibble()); + // Wait 1 second to ensure that all code in update_progress is run. + sleep(1); + $progress->update_progress(); + $this->assertEquals(2, $progress->get_current_state()); + $this->assertEquals(1, $progress->get_direction()); + $this->assertTimeCurrent($progress->get_last_wibble()); + $output = ob_get_clean(); + $this->assertContains('wibbler', $output); + $this->assertContains('wibble state0', $output); + $this->assertContains('wibble state1', $output); + } + + /** + * Test wibbler states. Wibbler should reverse direction at the start and end of its sequence. + */ + public function test_progress_display_wibbler() { + ob_start(); + $progress = new core_mock_progress_display(); + $progress->start_progress(''); + $this->assertEquals(1, $progress->get_direction()); + + // Set wibbler to final state and progress to check that it reverses direction. + $progress->set_current_state(core_mock_progress_display::WIBBLE_STATES); + sleep(1); + $progress->update_progress(); + $this->assertEquals(core_mock_progress_display::WIBBLE_STATES - 1, $progress->get_current_state()); + $this->assertEquals(-1, $progress->get_direction()); + + // Set wibbler to beginning and progress to check that it reverses direction. + $progress->set_current_state(0); + sleep(1); + $progress->update_progress(); + $this->assertEquals(1, $progress->get_current_state()); + $this->assertEquals(1, $progress->get_direction()); + $output = ob_get_clean(); + $this->assertContains('wibbler', $output); + $this->assertContains('wibble state0', $output); + $this->assertContains('wibble state13', $output); + + } + +} + +/** + * Helper class that allows access to private values + */ +class core_mock_progress_display extends \core\progress\display { + public function get_last_wibble() { + return $this->lastwibble; + } + + public function get_current_state() { + return $this->currentstate; + } + + public function get_direction() { + return $this->direction; + } + + public function set_current_state($state) { + $this->currentstate = $state; + } + + public function set_direction($direction) { + $this->direction = $direction; + } +}