Skip to content

Commit 5c4dc1e

Browse files
committed
test refactoring to deal with time flakiness
1 parent dbc0d86 commit 5c4dc1e

File tree

3 files changed

+50
-38
lines changed

3 files changed

+50
-38
lines changed

test/limiter/mixin_test.rb

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
module Limiter
66
class MixinTest < Minitest::Test
7+
include FakeSleep
8+
include AssertElapsed
9+
710
COUNT = 50
811
RATE = 1
912
INTERVAL = 1
@@ -26,34 +29,23 @@ def tick
2629

2730
def setup
2831
super
29-
RateQueue.send(:define_method, :sleep) { |i| Timecop.travel(Time.now + i) }
30-
end
31-
32-
def teardown
33-
RateQueue.send(:remove_method, :sleep)
34-
super
32+
@object = MixinTestClass.new
3533
end
3634

3735
def test_method_is_rate_limited
38-
object = MixinTestClass.new
39-
40-
start = Time.now
41-
42-
COUNT.times do
43-
object.tick
36+
assert_elapsed(COUNT.to_f / RATE - 1) do
37+
COUNT.times do
38+
@object.tick
39+
end
4440
end
45-
46-
assert_equal (start.to_i + (COUNT / RATE) - 1).to_i, Time.now.to_i
4741
end
4842

4943
def test_original_method_is_called
50-
object = MixinTestClass.new
51-
5244
COUNT.times do
53-
object.tick
45+
@object.tick
5446
end
5547

56-
assert_equal COUNT, object.ticks
48+
assert_equal COUNT, @object.ticks
5749
end
5850
end
5951
end

test/limiter/rate_queue_test.rb

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,36 @@
44

55
module Limiter
66
class RateQueueTest < Minitest::Test
7+
include FakeSleep
8+
include AssertElapsed
9+
710
COUNT = 50
811
RATE = 1
912
INTERVAL = 1
1013

1114
def setup
1215
super
1316
@queue = RateQueue.new(RATE, interval: INTERVAL)
14-
RateQueue.send(:define_method, :sleep) { |i| Timecop.travel(Time.now + i) }
15-
end
16-
17-
def teardown
18-
RateQueue.send(:remove_method, :sleep)
19-
super
2017
end
2118

2219
def test_shift_is_rate_limited
23-
start = Time.now
24-
25-
COUNT.times do
26-
@queue.shift
20+
assert_elapsed(COUNT.to_f / RATE - 1) do
21+
COUNT.times do
22+
@queue.shift
23+
end
2724
end
28-
29-
assert_equal (start.to_i + (COUNT / RATE) - 1).to_i, Time.now.to_i
3025
end
3126

3227
def test_shift_is_rate_limited_across_multiple_threads
33-
threads = Array.new(COUNT) do
34-
Thread.new do
35-
@queue.shift
36-
Time.now
28+
assert_elapsed(COUNT.to_f / RATE - 1) do
29+
threads = Array.new(COUNT) do
30+
Thread.new do
31+
@queue.shift
32+
end
3733
end
38-
end
39-
40-
times = threads.map(&:value)
4134

42-
assert_equal (times.min + (COUNT / RATE) - 1).to_i, times.max.to_i
35+
threads.each(&:join)
36+
end
4337
end
4438
end
4539
end

test/test_helper.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,29 @@
55

66
require 'minitest/autorun'
77
require 'timecop'
8+
9+
module Limiter
10+
module FakeSleep
11+
def setup
12+
super
13+
RateQueue.send(:define_method, :sleep) { |i| Timecop.travel(Time.now + i) }
14+
end
15+
16+
def teardown
17+
RateQueue.send(:remove_method, :sleep)
18+
super
19+
end
20+
end
21+
22+
module AssertElapsed
23+
def assert_elapsed(interval)
24+
started_at = Time.now.to_f
25+
26+
yield
27+
28+
completed_at = Time.now.to_f
29+
30+
assert_in_delta started_at + interval, completed_at, 1.1
31+
end
32+
end
33+
end

0 commit comments

Comments
 (0)