diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f7d5c5d..8d2eeef7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ ### UNRELEASED +### 7.6.1 + +* Add support for the Timecop 0.9.9 gem version so that we could track proper tests' execution time when `Process.clock_gettime` is mocked. + + https://github.com/KnapsackPro/knapsack_pro-ruby/pull/262 + +https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v7.6.0...v7.6.1 + ### 7.6.0 * Avoid starting an unnecessary process in Queue Mode. diff --git a/knapsack_pro.gemspec b/knapsack_pro.gemspec index 6ac4b5ef..c15132cd 100644 --- a/knapsack_pro.gemspec +++ b/knapsack_pro.gemspec @@ -38,5 +38,5 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'pry', '~> 0' spec.add_development_dependency 'vcr', '>= 6.0' spec.add_development_dependency 'webmock', '>= 3.13' - spec.add_development_dependency 'timecop', '>= 0.9.4' + spec.add_development_dependency 'timecop', '>= 0.9.9' end diff --git a/lib/knapsack_pro/formatters/time_tracker.rb b/lib/knapsack_pro/formatters/time_tracker.rb index 289c0d83..c41fa5b5 100644 --- a/lib/knapsack_pro/formatters/time_tracker.rb +++ b/lib/knapsack_pro/formatters/time_tracker.rb @@ -145,7 +145,7 @@ def merge(h1, h2) end def now - Process.clock_gettime(Process::CLOCK_MONOTONIC) + KnapsackPro::Utils.time_now end end end diff --git a/lib/knapsack_pro/tracker.rb b/lib/knapsack_pro/tracker.rb index 2ac09c89..72f33df3 100644 --- a/lib/knapsack_pro/tracker.rb +++ b/lib/knapsack_pro/tracker.rb @@ -155,7 +155,7 @@ def update_test_file_time(execution_time) end def now_without_mock_time - Process.clock_gettime(Process::CLOCK_MONOTONIC) + KnapsackPro::Utils.time_now end end end diff --git a/lib/knapsack_pro/utils.rb b/lib/knapsack_pro/utils.rb index 21a6099e..54a96778 100644 --- a/lib/knapsack_pro/utils.rb +++ b/lib/knapsack_pro/utils.rb @@ -5,5 +5,13 @@ class Utils def self.unsymbolize(obj) JSON.parse(obj.to_json) end + + def self.time_now + if defined?(Timecop) && Process.respond_to?(:clock_gettime_without_mock) + Process.clock_gettime_without_mock(Process::CLOCK_MONOTONIC) + else + Process.clock_gettime(Process::CLOCK_MONOTONIC) + end + end end end diff --git a/spec/knapsack_pro/utils_spec.rb b/spec/knapsack_pro/utils_spec.rb index 232d683f..d7494c9a 100644 --- a/spec/knapsack_pro/utils_spec.rb +++ b/spec/knapsack_pro/utils_spec.rb @@ -16,4 +16,40 @@ ]) end end + + describe '.time_now' do + subject { described_class.time_now } + + context 'when Timecop does not mock the time' do + it do + now = Process.clock_gettime(Process::CLOCK_MONOTONIC) + expect(subject).to be_within(0.001).of(now) + end + end + + context 'when Timecop does mock the process clock' do + around(:example) do |ex| + unless Gem::Version.new(Timecop::VERSION) >= Gem::Version.new('0.9.9') + raise 'Timecop >= 0.9.9 is required to run this test. Please run: bundle update' + end + + if Gem::Version.new(Timecop::VERSION) >= Gem::Version.new('0.9.10') + Timecop.mock_process_clock = true + ex.run + Timecop.mock_process_clock = false + else + ex.run + end + end + + it do + now = Process.clock_gettime(Process::CLOCK_MONOTONIC) + + time = Time.local(2020, 1, 31) + Timecop.travel(time) do + expect(subject).to be_within(0.001).of(now) + end + end + end + end end