Skip to content

Commit

Permalink
wrap Time.now for testability
Browse files Browse the repository at this point in the history
  • Loading branch information
sbfaulkner committed Feb 15, 2019
1 parent df50c7f commit 578af89
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 5 deletions.
1 change: 1 addition & 0 deletions lib/limiter.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# frozen_string_literal: true

require 'limiter/clock'
require 'limiter/mixin'
require 'limiter/rate_queue'
require 'limiter/version'
30 changes: 30 additions & 0 deletions lib/limiter/clock.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# frozen_string_literal: true

require 'singleton'

module Limiter
class Clock
include Singleton

extend SingleForwardable
def_single_delegators :instance, :skip, :time

def initialize
@offset = 0
end

def skip(interval)
@offset += interval
end

def time
now + @offset
end

private

def now
Time.now
end
end
end
4 changes: 2 additions & 2 deletions lib/limiter/rate_queue.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def shift

sleep_until(time + @interval)

@ring[@head] = Time.now
@ring[@head] = Clock.time
@head = (@head + 1) % @size
end

Expand All @@ -31,7 +31,7 @@ def shift
private

def sleep_until(time)
interval = time - Time.now
interval = time - Clock.time
return unless interval.positive?
sleep(interval)
end
Expand Down
21 changes: 21 additions & 0 deletions test/limiter/clock_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# frozen_string_literal: true

require 'test_helper'

module Limiter
class ClockTest < Minitest::Test
def setup
super
@start_time = Clock.time
end

def test_clock_is_advancing
assert Clock.time > @start_time
end

def test_skips_interval
Clock.skip(300)
assert Clock.time >= (@start_time + 300)
end
end
end
6 changes: 3 additions & 3 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ module Limiter
module FakeSleep
def setup
super
RateQueue.send(:define_method, :sleep) { |i| Timecop.travel(Time.now + i) }
RateQueue.send(:define_method, :sleep) { |i| Clock.skip(i) }
end

def teardown
Expand All @@ -21,11 +21,11 @@ def teardown

module AssertElapsed
def assert_elapsed(interval)
started_at = Time.now.to_f
started_at = Clock.time

yield

completed_at = Time.now.to_f
completed_at = Clock.time

assert_in_delta started_at + interval, completed_at, 1.1
end
Expand Down

0 comments on commit 578af89

Please sign in to comment.