diff --git a/admin/tool/monitor/tests/eventobservers_test.php b/admin/tool/monitor/tests/eventobservers_test.php index 9239e16e55a..a1cb38423da 100644 --- a/admin/tool/monitor/tests/eventobservers_test.php +++ b/admin/tool/monitor/tests/eventobservers_test.php @@ -384,7 +384,7 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase { // Now let us trigger 7 instances of the event. $event = \mod_book\event\course_module_instance_list_viewed::create_from_course($course); $event->trigger(); - sleep(1); // Add a second delay, to prevent time collisions. + $this->waitForSecond(); // Add a second delay, to prevent time collisions. } $this->run_adhock_tasks(); $messages = $messagesink->get_messages(); diff --git a/lib/phpunit/classes/advanced_testcase.php b/lib/phpunit/classes/advanced_testcase.php index 7ee75ebf374..096fe8a0c97 100644 --- a/lib/phpunit/classes/advanced_testcase.php +++ b/lib/phpunit/classes/advanced_testcase.php @@ -607,4 +607,17 @@ abstract class advanced_testcase extends base_testcase { } } } + + /** + * Wait for a second to roll over, ensures future calls to time() return a different result. + * + * This is implemented instead of sleep() as we do not need to wait a full second. In some cases + * due to calls we may wait more than sleep() would have, on average it will be less. + */ + public function waitForSecond() { + $starttime = time(); + while (time() == $starttime) { + usleep(50000); + } + } } diff --git a/lib/phpunit/tests/advanced_test.php b/lib/phpunit/tests/advanced_test.php index cf00787a6ab..bca2d378cc8 100644 --- a/lib/phpunit/tests/advanced_test.php +++ b/lib/phpunit/tests/advanced_test.php @@ -358,7 +358,7 @@ class core_phpunit_advanced_testcase extends advanced_testcase { $this->setCurrentTimeStart(); $this->assertTimeCurrent(time()); - sleep(2); + $this->waitForSecond(); $this->assertTimeCurrent(time()); $this->assertTimeCurrent(time()-1); diff --git a/lib/tests/coursecatlib_test.php b/lib/tests/coursecatlib_test.php index d930044d676..7809595538c 100644 --- a/lib/tests/coursecatlib_test.php +++ b/lib/tests/coursecatlib_test.php @@ -236,7 +236,7 @@ class core_coursecatlib_testcase extends advanced_testcase { $timecreated = $category1->timemodified; $this->assertSame('Cat1', $category1->name); $this->assertTrue(empty($category1->description)); - sleep(2); + $this->waitForSecond(); $testdescription = 'This is cat 1 а также русский текст'; $category1->update(array('description' => $testdescription)); $this->assertSame($testdescription, $category1->description); diff --git a/mod/assign/tests/lib_test.php b/mod/assign/tests/lib_test.php index 66cabaf38be..34e52194a15 100644 --- a/mod/assign/tests/lib_test.php +++ b/mod/assign/tests/lib_test.php @@ -72,7 +72,7 @@ class mod_assign_lib_testcase extends mod_assign_base_testcase { $assign->testable_apply_grade_to_user($data, $this->students[0]->id, 0); // This is required so that the submissions timemodified > the grade timemodified. - sleep(2); + $this->waitForSecond(); // Edit the submission again. $this->setUser($this->students[0]); @@ -80,7 +80,7 @@ class mod_assign_lib_testcase extends mod_assign_base_testcase { $assign->testable_update_submission($submission, $this->students[0]->id, true, false); // This is required so that the submissions timemodified > the grade timemodified. - sleep(2); + $this->waitForSecond(); // Allow the student another attempt. $this->teachers[0]->ignoresesskey = true; diff --git a/mod/assign/tests/locallib_test.php b/mod/assign/tests/locallib_test.php index 0118581b50a..1918d3dc613 100644 --- a/mod/assign/tests/locallib_test.php +++ b/mod/assign/tests/locallib_test.php @@ -822,7 +822,7 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase { $plugin->save($submission, $data); // Wait 1 second so the submission and grade do not have the same timemodified. - sleep(1); + $this->waitForSecond(); // Simulate adding a grade. $this->setUser($this->teachers[0]); $data = new stdClass();