code: protected function onTimeout(RunnerServiceContext $context, AssessmentTestSessionException $timeOutException)
      {
          /* @var TestSession $session */
          $session = $context->getTestSession();
  
          $event = new TestTimeoutEvent($session, $timeOutException->getCode(), true);
          $this->getServiceManager()->get(EventManager::SERVICE_ID)->trigger($event);
  
          $isLinear = $session->getCurrentNavigationMode() === NavigationMode::LINEAR;
          switch ($timeOutException->getCode()) {
              case AssessmentTestSessionException::ASSESSMENT_TEST_DURATION_OVERFLOW:
                  \common_Logger::i('TIMEOUT: closing the assessment test session');
                  $session->endTestSession();
                  break;
  
              case AssessmentTestSessionException::TEST_PART_DURATION_OVERFLOW:
                  if ($isLinear) {
                      \common_Logger::i('TIMEOUT: moving to the next test part');
                      $session->moveNextTestPart();
                  } else {
                      \common_Logger::i('TIMEOUT: closing the assessment test part');
                      $session->closeTestPart();
                  }
                  break;
  
              case AssessmentTestSessionException::ASSESSMENT_SECTION_DURATION_OVERFLOW:
                  if ($isLinear) {
                      \common_Logger::i('TIMEOUT: moving to the next assessment section');
                      $session->moveNextAssessmentSection();
                  } else {
                      \common_Logger::i('TIMEOUT: closing the assessment section session');
                      $session->closeAssessmentSection();
                  }
                  break;
  
              case AssessmentTestSessionException::ASSESSMENT_ITEM_DURATION_OVERFLOW:
                  if ($isLinear) {
                      \common_Logger::i('TIMEOUT: moving to the next item');
                      $session->moveNextAssessmentItem();
                  } else {
                      \common_Logger::i('TIMEOUT: closing the assessment item session');
                      $session->closeAssessmentItem();
                  }
                  break;
          }
  
          $event = new TestTimeoutEvent($session, $timeOutException->getCode(), false);
          $this->getServiceManager()->get(EventManager::SERVICE_ID)->trigger($event);
  
          $this->continueInteraction($context);
      }
docs: Stuff to be undertaken when the Assessment Item presented to the candidate
  times out.
  
  @param RunnerServiceContext $context
  @param AssessmentTestSessionException $timeOutException The AssessmentTestSessionException object thrown to indicate the timeout.