File tree Expand file tree Collapse file tree 3 files changed +50
-38
lines changed
Expand file tree Collapse file tree 3 files changed +50
-38
lines changed Original file line number Diff line number Diff line change 44
55module 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
5951end
Original file line number Diff line number Diff line change 44
55module 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
4539end
Original file line number Diff line number Diff line change 55
66require 'minitest/autorun'
77require '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
You can’t perform that action at this time.
0 commit comments