diff options
Diffstat (limited to 'qa/qa/support')
-rw-r--r-- | qa/qa/support/page/logging.rb | 12 | ||||
-rw-r--r-- | qa/qa/support/retrier.rb | 28 | ||||
-rw-r--r-- | qa/qa/support/waiter.rb | 31 |
3 files changed, 63 insertions, 8 deletions
diff --git a/qa/qa/support/page/logging.rb b/qa/qa/support/page/logging.rb index f2cd0194b6b..5e97a92a6e3 100644 --- a/qa/qa/support/page/logging.rb +++ b/qa/qa/support/page/logging.rb @@ -10,15 +10,11 @@ module QA super end - def wait(max: 60, time: 0.1, reload: true) - log("with wait: max #{max}; time #{time}; reload #{reload}") - now = Time.now - - element = super + def wait(max: 60, interval: 0.1, reload: true) + log("next wait uses reload: #{reload}") + # Logging of wait start/end/duration is handled by QA::Support::Waiter - log("ended wait after #{Time.now - now} seconds") - - element + super end def scroll_to(selector, text: nil) diff --git a/qa/qa/support/retrier.rb b/qa/qa/support/retrier.rb new file mode 100644 index 00000000000..8be4e9f5365 --- /dev/null +++ b/qa/qa/support/retrier.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +module QA + module Support + module Retrier + module_function + + def retry_on_exception(max_attempts: 3, reload_page: nil, sleep_interval: 0.5) + QA::Runtime::Logger.debug("with retry_on_exception: max_attempts #{max_attempts}; sleep_interval #{sleep_interval}") + + attempts = 0 + + begin + QA::Runtime::Logger.debug("Attempt number #{attempts + 1}") + yield + rescue StandardError, RSpec::Expectations::ExpectationNotMetError + sleep sleep_interval + reload_page.refresh if reload_page + attempts += 1 + + retry if attempts < max_attempts + QA::Runtime::Logger.debug("Raising exception after #{max_attempts} attempts") + raise + end + end + end + end +end diff --git a/qa/qa/support/waiter.rb b/qa/qa/support/waiter.rb new file mode 100644 index 00000000000..21a399b4a5f --- /dev/null +++ b/qa/qa/support/waiter.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module QA + module Support + module Waiter + module_function + + def wait(max: 60, interval: 0.1) + QA::Runtime::Logger.debug("with wait: max #{max}; interval #{interval}") + start = Time.now + + while Time.now - start < max + result = yield + if result + log_end(Time.now - start) + return result + end + + sleep(interval) + end + log_end(Time.now - start) + + false + end + + def self.log_end(duration) + QA::Runtime::Logger.debug("ended wait after #{duration} seconds") + end + end + end +end |