class Timeoutable::TestableKlass

Constants

BIT_NAME

Attributes

logger[R]

Public Class Methods

new(logger: Logger.new($stdout)) click to toggle source
# File lib/timeoutable/testable_klass.rb, line 24
def initialize(logger: Logger.new($stdout))
  @logger = logger
end
perform_test(warn: 2, timeout: 3, sleep_after: 0.1 , sleep_for: 0.1, logger: Logger.new($stdout)) click to toggle source

:nocov:

# File lib/timeoutable/testable_klass.rb, line 10
def self.perform_test(warn: 2, timeout: 3, sleep_after: 0.1 , sleep_for: 0.1, logger: Logger.new($stdout))
  params = {
    warn: warn,
    timeout: timeout,
    proc: ->(thread, sec) { thread[BIT_NAME] = 1; logger.warn('at: proc -- Set Bit') },
    message: "Yoooo. Your code violently blew up. Handle it accordingly",
  }
  Timeoutable.timeout(**params) do
    new.execute(sleep_after: sleep_after, sleep_for: sleep_for)
  end
end

Public Instance Methods

execute(sleep_after:, sleep_for:, max_iterations: 10_000, raise_warn: false, raise_timeout: false) click to toggle source
# File lib/timeoutable/testable_klass.rb, line 28
def execute(sleep_after:, sleep_for:, max_iterations: 10_000, raise_warn: false, raise_timeout: false)
  logger.info("at: execute -- Start")
  count = 0
  while count <= max_iterations && Thread.current[BIT_NAME].nil?
    raise StandardError, 'Throwing error before warn bit' if raise_warn
    logger.info("at: execute -- sleeping for #{sleep_for}'s [#{count} iterations]")
    sleep(sleep_for)
    count += 1
  end
  raise StandardError, 'Throwing error after warn bit' if raise_timeout

  logger.info("at: execute -- Worker noticed sleep bit changed -- Cycle broken")

  logger.warn("at: execute -- sleeping 1 last time for #{sleep_after}'s")
  sleep(sleep_after)
  logger.warn("at: execute -- returning after sleep")
  logger.info("at: execute -- End")
ensure
  logger.info("at: execute (ensure) -- ensure bit resetting")
end