Class: Henitai::TimeoutCalibrator
- Inherits:
-
Object
- Object
- Henitai::TimeoutCalibrator
- Defined in:
- lib/henitai/timeout_calibrator.rb,
sig/henitai.rbs
Overview
Derives a per-mutant timeout from measured per-test-file durations.
The calibrated value is multiplier × sum(durations of the selected test files), clamped to a floor so a near-instant baseline doesn't flag normal
jitter as a timeout. Returns nil — caller falls back to the static
default — when any selected test lacks timing data, so a partially
measured run is treated as uncalibratable rather than under-estimated.
Constant Summary collapse
- FLOOR_SECONDS =
2.0
Instance Method Summary collapse
- #durations ⇒ Hash[String, untyped]
-
#initialize(timing_source:, multiplier:) ⇒ TimeoutCalibrator
constructor
A new instance of TimeoutCalibrator.
- #normalize(path) ⇒ String
- #timeout_for(test_files) ⇒ Float?
Constructor Details
#initialize(timing_source:, multiplier:) ⇒ TimeoutCalibrator
Returns a new instance of TimeoutCalibrator.
17 18 19 20 |
# File 'lib/henitai/timeout_calibrator.rb', line 17 def initialize(timing_source:, multiplier:) @timing_source = timing_source @multiplier = multiplier end |
Instance Method Details
#durations ⇒ Hash[String, untyped]
36 37 38 |
# File 'lib/henitai/timeout_calibrator.rb', line 36 def durations @durations ||= (@timing_source.call || {}).transform_keys { |key| normalize(key) } end |
#normalize(path) ⇒ String
40 41 42 |
# File 'lib/henitai/timeout_calibrator.rb', line 40 def normalize(path) File.(path.to_s) end |
#timeout_for(test_files) ⇒ Float?
24 25 26 27 28 29 30 31 32 |
# File 'lib/henitai/timeout_calibrator.rb', line 24 def timeout_for(test_files) files = Array(test_files) return nil if files.empty? || durations.empty? baselines = files.map { |file| durations[normalize(file)] } return nil if baselines.any?(&:nil?) [@multiplier * baselines.sum, FLOOR_SECONDS].max end |