logster 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +18 -18
  3. data/.travis.yml +15 -15
  4. data/CHANGELOG.md +137 -130
  5. data/Gemfile +4 -4
  6. data/Guardfile +8 -8
  7. data/LICENSE.txt +22 -22
  8. data/README.md +99 -99
  9. data/Rakefile +24 -24
  10. data/assets/fonts/FontAwesome.otf +0 -0
  11. data/assets/fonts/fontawesome-webfont.eot +0 -0
  12. data/assets/fonts/fontawesome-webfont.svg +639 -639
  13. data/assets/fonts/fontawesome-webfont.ttf +0 -0
  14. data/assets/fonts/fontawesome-webfont.woff +0 -0
  15. data/assets/fonts/fontawesome-webfont.woff2 +0 -0
  16. data/assets/images/Icon-144_rounded.png +0 -0
  17. data/assets/images/Icon-144_square.png +0 -0
  18. data/assets/images/icon_144x144.png +0 -0
  19. data/assets/images/icon_64x64.png +0 -0
  20. data/assets/javascript/client-app.js +81 -81
  21. data/assets/javascript/vendor.js +5302 -5302
  22. data/assets/stylesheets/client-app.css +0 -0
  23. data/assets/stylesheets/vendor.css +3 -3
  24. data/build_client_app.sh +12 -12
  25. data/client-app/.editorconfig +20 -20
  26. data/client-app/.ember-cli +9 -9
  27. data/client-app/.eslintignore +19 -19
  28. data/client-app/.eslintrc.js +46 -46
  29. data/client-app/.gitignore +23 -23
  30. data/client-app/.travis.yml +27 -27
  31. data/client-app/.watchmanconfig +3 -3
  32. data/client-app/README.md +57 -57
  33. data/client-app/app/app.js +14 -14
  34. data/client-app/app/components/message-info.js +18 -18
  35. data/client-app/app/components/message-row.js +45 -45
  36. data/client-app/app/components/panel-resizer.js +75 -75
  37. data/client-app/app/components/tab-contents.js +27 -27
  38. data/client-app/app/components/tab-link.js +5 -5
  39. data/client-app/app/components/tabbed-section.js +32 -32
  40. data/client-app/app/components/time-formatter.js +25 -25
  41. data/client-app/app/components/update-time.js +21 -21
  42. data/client-app/app/controllers/index.js +83 -83
  43. data/client-app/app/controllers/show.js +13 -13
  44. data/client-app/app/index.html +29 -29
  45. data/client-app/app/initializers/app-init.js +55 -55
  46. data/client-app/app/lib/preload.js +14 -14
  47. data/client-app/app/lib/utilities.js +140 -140
  48. data/client-app/app/models/message-collection.js +158 -158
  49. data/client-app/app/models/message.js +99 -99
  50. data/client-app/app/resolver.js +3 -3
  51. data/client-app/app/router.js +14 -14
  52. data/client-app/app/routes/index.js +53 -53
  53. data/client-app/app/routes/show.js +14 -14
  54. data/client-app/app/styles/app.css +387 -387
  55. data/client-app/app/templates/application.hbs +2 -2
  56. data/client-app/app/templates/components/message-info.hbs +44 -44
  57. data/client-app/app/templates/components/message-row.hbs +17 -17
  58. data/client-app/app/templates/components/tabbed-section.hbs +10 -10
  59. data/client-app/app/templates/components/time-formatter.hbs +1 -1
  60. data/client-app/app/templates/index.hbs +57 -57
  61. data/client-app/app/templates/show.hbs +4 -4
  62. data/client-app/config/environment.js +51 -51
  63. data/client-app/config/optional-features.json +3 -3
  64. data/client-app/config/targets.js +18 -18
  65. data/client-app/ember-cli-build.js +29 -29
  66. data/client-app/package-lock.json +11365 -11365
  67. data/client-app/package.json +56 -56
  68. data/client-app/testem.js +25 -25
  69. data/client-app/tests/index.html +34 -34
  70. data/client-app/tests/integration/components/message-info-test.js +26 -26
  71. data/client-app/tests/integration/components/message-row-test.js +26 -26
  72. data/client-app/tests/integration/components/panel-resizer-test.js +26 -26
  73. data/client-app/tests/integration/components/tab-contents-test.js +26 -26
  74. data/client-app/tests/integration/components/tab-link-test.js +26 -26
  75. data/client-app/tests/integration/components/tabbed-section-test.js +26 -26
  76. data/client-app/tests/integration/components/time-formatter-test.js +26 -26
  77. data/client-app/tests/integration/components/update-time-test.js +26 -26
  78. data/client-app/tests/test-helper.js +8 -8
  79. data/client-app/tests/unit/controllers/index-test.js +12 -12
  80. data/client-app/tests/unit/controllers/show-test.js +12 -12
  81. data/client-app/tests/unit/initializers/app-init-test.js +31 -31
  82. data/client-app/tests/unit/routes/index-test.js +11 -11
  83. data/client-app/tests/unit/routes/show-test.js +11 -11
  84. data/lib/examples/sidekiq_logster_reporter.rb +21 -21
  85. data/lib/logster.rb +54 -54
  86. data/lib/logster/base_store.rb +130 -130
  87. data/lib/logster/configuration.rb +25 -25
  88. data/lib/logster/ignore_pattern.rb +65 -65
  89. data/lib/logster/logger.rb +108 -102
  90. data/lib/logster/message.rb +227 -227
  91. data/lib/logster/middleware/debug_exceptions.rb +26 -26
  92. data/lib/logster/middleware/reporter.rb +56 -56
  93. data/lib/logster/middleware/viewer.rb +220 -220
  94. data/lib/logster/rails/railtie.rb +58 -58
  95. data/lib/logster/redis_store.rb +481 -481
  96. data/lib/logster/version.rb +3 -3
  97. data/lib/logster/web.rb +14 -14
  98. data/logster.gemspec +34 -34
  99. data/test/examples/test_sidekiq_reporter_example.rb +46 -46
  100. data/test/fake_data/Gemfile +4 -4
  101. data/test/fake_data/generate.rb +10 -10
  102. data/test/logster/middleware/test_reporter.rb +21 -21
  103. data/test/logster/middleware/test_viewer.rb +96 -96
  104. data/test/logster/test_base_store.rb +147 -147
  105. data/test/logster/test_ignore_pattern.rb +41 -41
  106. data/test/logster/test_logger.rb +80 -74
  107. data/test/logster/test_message.rb +34 -34
  108. data/test/logster/test_redis_rate_limiter.rb +230 -230
  109. data/test/logster/test_redis_store.rb +427 -427
  110. data/test/test_helper.rb +38 -38
  111. data/vendor/assets/javascripts/logster.js.erb +39 -39
  112. metadata +3 -3
@@ -1,34 +1,34 @@
1
- require_relative '../test_helper'
2
- require 'logster/message'
3
-
4
- class TestMessage < MiniTest::Test
5
-
6
- def test_merge_similar
7
- msg1 = Logster::Message.new(0, '', 'test', 10)
8
- msg1.populate_from_env(a: "1", b: "2")
9
-
10
- msg2 = Logster::Message.new(0, '', 'test', 20)
11
- msg2.populate_from_env(a: "2", c: "3")
12
-
13
- assert_equal(msg2.grouping_key, msg1.grouping_key)
14
-
15
- msg1.merge_similar_message(msg2)
16
-
17
- msg1 = Logster::Message.from_json(msg1.to_json)
18
-
19
- assert_equal(20, msg1.timestamp)
20
- assert_equal(10, msg1.first_timestamp)
21
- end
22
-
23
- def test_adds_application_version
24
- Logster.config.application_version = "abc"
25
- msg = Logster::Message.new(0, '', 'test', 10)
26
- msg.populate_from_env({})
27
-
28
- assert_equal("abc", msg.env["application_version"])
29
-
30
- ensure
31
- Logster.config.application_version = nil
32
- end
33
-
34
- end
1
+ require_relative '../test_helper'
2
+ require 'logster/message'
3
+
4
+ class TestMessage < MiniTest::Test
5
+
6
+ def test_merge_similar
7
+ msg1 = Logster::Message.new(0, '', 'test', 10)
8
+ msg1.populate_from_env(a: "1", b: "2")
9
+
10
+ msg2 = Logster::Message.new(0, '', 'test', 20)
11
+ msg2.populate_from_env(a: "2", c: "3")
12
+
13
+ assert_equal(msg2.grouping_key, msg1.grouping_key)
14
+
15
+ msg1.merge_similar_message(msg2)
16
+
17
+ msg1 = Logster::Message.from_json(msg1.to_json)
18
+
19
+ assert_equal(20, msg1.timestamp)
20
+ assert_equal(10, msg1.first_timestamp)
21
+ end
22
+
23
+ def test_adds_application_version
24
+ Logster.config.application_version = "abc"
25
+ msg = Logster::Message.new(0, '', 'test', 10)
26
+ msg.populate_from_env({})
27
+
28
+ assert_equal("abc", msg.env["application_version"])
29
+
30
+ ensure
31
+ Logster.config.application_version = nil
32
+ end
33
+
34
+ end
@@ -1,230 +1,230 @@
1
- require_relative '../test_helper'
2
- require 'logster/redis_store'
3
- require 'rack'
4
-
5
- class TestRedisRateLimiter < Minitest::Test
6
- def setup
7
- @redis = Redis.new
8
- end
9
-
10
- def teardown
11
- @redis.flushall
12
- Timecop.return
13
- end
14
-
15
- def test_clear_all
16
- called = 0
17
-
18
- @redis.set("dont_nuke", "1")
19
-
20
- @rate_limiter = Logster::RedisRateLimiter.new(
21
- @redis, [Logger::WARN], 8, 60, Proc.new { "prefix" }, Proc.new { called += 1 }
22
- )
23
-
24
- 9.times do
25
- @rate_limiter.check(Logger::WARN)
26
- end
27
-
28
- assert_equal 10, @rate_limiter.check(Logger::WARN)
29
-
30
- Logster::RedisRateLimiter.clear_all(@redis, Proc.new { "prefix" })
31
-
32
- assert_equal 1, @rate_limiter.check(Logger::WARN)
33
-
34
- # also clears when prefix missing
35
- Logster::RedisRateLimiter.clear_all(@redis)
36
-
37
- assert_equal 1, @rate_limiter.check(Logger::WARN)
38
-
39
- assert_equal "1", @redis.get("dont_nuke")
40
- @redis.del("dont_nuke")
41
-
42
- end
43
-
44
- def test_check
45
- time = Time.new(2015, 1, 1, 1, 1)
46
- Timecop.freeze(time)
47
- called = 0
48
-
49
- @rate_limiter = Logster::RedisRateLimiter.new(
50
- @redis, [Logger::WARN], 8, 60, nil, Proc.new { called += 1 }
51
- )
52
-
53
- assert_equal(1, @rate_limiter.check(Logger::WARN))
54
- assert_redis_key(60, 0)
55
- assert_equal(1, number_of_buckets)
56
-
57
- Timecop.freeze(time + 10) do
58
- assert_equal(2, @rate_limiter.check(Logger::WARN))
59
- assert_redis_key(60, 1)
60
- assert_equal(3, @rate_limiter.check(Logger::WARN))
61
- assert_equal(2, number_of_buckets)
62
- end
63
-
64
- Timecop.freeze(time + 20) do
65
- assert_equal(4, @rate_limiter.check(Logger::WARN))
66
- assert_redis_key(60, 2)
67
- assert_equal(3, number_of_buckets)
68
- end
69
-
70
- Timecop.freeze(time + 30) do
71
- assert_equal(5, @rate_limiter.check(Logger::WARN))
72
- assert_redis_key(60, 3)
73
- assert_equal(4, number_of_buckets)
74
- end
75
-
76
- Timecop.freeze(time + 40) do
77
- assert_equal(6, @rate_limiter.check(Logger::WARN))
78
- assert_redis_key(60, 4)
79
- assert_equal(5, number_of_buckets)
80
- end
81
-
82
- Timecop.freeze(time + 50) do
83
- assert_equal(7, @rate_limiter.check(Logger::WARN))
84
- assert_redis_key(60, 5)
85
- assert_equal(6, number_of_buckets)
86
- end
87
-
88
- Timecop.freeze(time + 60) do
89
- @redis.del("#{key}:0")
90
- assert_equal(5, number_of_buckets)
91
-
92
- assert_equal(7, @rate_limiter.check(Logger::WARN))
93
- assert_redis_key(60, 0)
94
- assert_equal(6, number_of_buckets)
95
-
96
- assert_equal(8, @rate_limiter.check(Logger::WARN))
97
- assert_equal(1, called)
98
- assert_equal(6, number_of_buckets)
99
- assert_equal("1", @redis.get(@rate_limiter.callback_key))
100
- end
101
-
102
- Timecop.freeze(time + 70) do
103
- @redis.del("#{key}:1")
104
- assert_equal(7, @rate_limiter.check(Logger::WARN))
105
- assert_nil(@redis.get(@rate_limiter.callback_key))
106
- end
107
- end
108
-
109
- def test_check_with_multiple_severities
110
- time = Time.new(2015, 1, 1, 1, 1)
111
- Timecop.freeze(time)
112
- called = 0
113
-
114
- @rate_limiter = Logster::RedisRateLimiter.new(
115
- @redis, [Logger::WARN, Logger::ERROR], 4, 60, nil, Proc.new { called += 1 }
116
- )
117
-
118
- assert_equal(1, @rate_limiter.check(Logger::WARN))
119
- assert_equal(2, @rate_limiter.check(Logger::ERROR))
120
-
121
- Timecop.freeze(time + 50) do
122
- assert_equal(3, @rate_limiter.check(Logger::WARN))
123
- assert_equal(4, @rate_limiter.check(Logger::ERROR))
124
- assert_equal(2, number_of_buckets)
125
- end
126
-
127
- assert_equal(5, @rate_limiter.check(Logger::ERROR))
128
- assert_equal(1, called)
129
- end
130
-
131
- def test_bucket_number_per_minute
132
- time = Time.new(2015, 1, 1, 1, 1)
133
- Timecop.freeze(time)
134
- @rate_limiter = Logster::RedisRateLimiter.new(@redis, [Logger::WARN], 1, 60)
135
-
136
- assert_bucket_number(0, time)
137
- assert_bucket_number(0, time + 9)
138
- assert_bucket_number(1, time + 11)
139
- assert_bucket_number(5, time + 59)
140
- end
141
-
142
- def test_bucket_number_per_hour
143
- time = Time.new(2015, 1, 1, 1, 0)
144
- Timecop.freeze(time)
145
- @rate_limiter = Logster::RedisRateLimiter.new(@redis, [Logger::WARN], 1, 3600)
146
-
147
- assert_bucket_number(0, time)
148
- assert_bucket_number(1, time + 1199)
149
- assert_bucket_number(2, time + 1200)
150
- assert_bucket_number(5, time + 3599)
151
- end
152
-
153
- def test_bucket_expiry
154
- time = Time.new(2015, 1, 1, 1, 1)
155
- Timecop.freeze(time)
156
- @rate_limiter = Logster::RedisRateLimiter.new(@redis, [Logger::WARN], 1, 60)
157
-
158
- assert_bucket_expiry(60, time)
159
- assert_bucket_expiry(55, time + 5)
160
- assert_bucket_expiry(60, time + 10)
161
- assert_bucket_expiry(58, time + 12)
162
- assert_bucket_expiry(55, time + 15)
163
- assert_bucket_expiry(51, time + 19)
164
- assert_bucket_expiry(60, time + 20)
165
- assert_bucket_expiry(55, time + 35)
166
- end
167
-
168
- def test_raw_connection
169
- time = Time.new(2015, 1, 1, 1, 1)
170
- Timecop.freeze(time)
171
- @rate_limiter = Logster::RedisRateLimiter.new(@redis, [Logger::WARN], 1, 60, Proc.new { "lobster" })
172
-
173
- assert_equal(1, @rate_limiter.check(Logger::WARN))
174
- assert_redis_key(60, 0)
175
-
176
- toggle = true
177
-
178
- @rate_limiter = Logster::RedisRateLimiter.new(
179
- @redis, [Logger::WARN], 1, 60, Proc.new { toggle ? 'lobster1' : 'lobster2' }
180
- )
181
-
182
- assert_includes(key, "lobster1")
183
-
184
- toggle = false
185
- assert_includes(key, "lobster2")
186
- end
187
-
188
- def test_retrieve_rate
189
- time = Time.new(2015, 1, 1, 1 , 1)
190
- Timecop.freeze(time)
191
-
192
- @rate_limiter = Logster::RedisRateLimiter.new(@redis, [Logger::WARN], 1, 60)
193
-
194
- @rate_limiter.check(Logger::WARN)
195
- assert_equal(@rate_limiter.retrieve_rate, 1)
196
-
197
- Timecop.freeze(time + 50) do
198
- @rate_limiter.check(Logger::WARN)
199
- assert_equal(@rate_limiter.retrieve_rate, 2)
200
- end
201
- end
202
-
203
- private
204
-
205
- def key
206
- @rate_limiter.key
207
- end
208
-
209
- def number_of_buckets
210
- @redis.keys("#{key}:[0-#{Logster::RedisRateLimiter::BUCKETS}]").size
211
- end
212
-
213
- def assert_bucket_number(expected, time)
214
- Timecop.freeze(time) do
215
- assert_equal(expected, @rate_limiter.send(:bucket_number, Time.now.to_i))
216
- end
217
- end
218
-
219
- def assert_bucket_expiry(expected, time)
220
- Timecop.freeze(time) do
221
- assert_equal(expected, @rate_limiter.send(:bucket_expiry, Time.now.to_i))
222
- end
223
- end
224
-
225
- def assert_redis_key(expected_ttl, expected_bucket_number)
226
- redis_key = "#{key}:#{expected_bucket_number}"
227
- assert(@redis.get(redis_key), "the right bucket should be created")
228
- assert_equal(expected_ttl, @redis.ttl(redis_key))
229
- end
230
- end
1
+ require_relative '../test_helper'
2
+ require 'logster/redis_store'
3
+ require 'rack'
4
+
5
+ class TestRedisRateLimiter < Minitest::Test
6
+ def setup
7
+ @redis = Redis.new
8
+ end
9
+
10
+ def teardown
11
+ @redis.flushall
12
+ Timecop.return
13
+ end
14
+
15
+ def test_clear_all
16
+ called = 0
17
+
18
+ @redis.set("dont_nuke", "1")
19
+
20
+ @rate_limiter = Logster::RedisRateLimiter.new(
21
+ @redis, [Logger::WARN], 8, 60, Proc.new { "prefix" }, Proc.new { called += 1 }
22
+ )
23
+
24
+ 9.times do
25
+ @rate_limiter.check(Logger::WARN)
26
+ end
27
+
28
+ assert_equal 10, @rate_limiter.check(Logger::WARN)
29
+
30
+ Logster::RedisRateLimiter.clear_all(@redis, Proc.new { "prefix" })
31
+
32
+ assert_equal 1, @rate_limiter.check(Logger::WARN)
33
+
34
+ # also clears when prefix missing
35
+ Logster::RedisRateLimiter.clear_all(@redis)
36
+
37
+ assert_equal 1, @rate_limiter.check(Logger::WARN)
38
+
39
+ assert_equal "1", @redis.get("dont_nuke")
40
+ @redis.del("dont_nuke")
41
+
42
+ end
43
+
44
+ def test_check
45
+ time = Time.new(2015, 1, 1, 1, 1)
46
+ Timecop.freeze(time)
47
+ called = 0
48
+
49
+ @rate_limiter = Logster::RedisRateLimiter.new(
50
+ @redis, [Logger::WARN], 8, 60, nil, Proc.new { called += 1 }
51
+ )
52
+
53
+ assert_equal(1, @rate_limiter.check(Logger::WARN))
54
+ assert_redis_key(60, 0)
55
+ assert_equal(1, number_of_buckets)
56
+
57
+ Timecop.freeze(time + 10) do
58
+ assert_equal(2, @rate_limiter.check(Logger::WARN))
59
+ assert_redis_key(60, 1)
60
+ assert_equal(3, @rate_limiter.check(Logger::WARN))
61
+ assert_equal(2, number_of_buckets)
62
+ end
63
+
64
+ Timecop.freeze(time + 20) do
65
+ assert_equal(4, @rate_limiter.check(Logger::WARN))
66
+ assert_redis_key(60, 2)
67
+ assert_equal(3, number_of_buckets)
68
+ end
69
+
70
+ Timecop.freeze(time + 30) do
71
+ assert_equal(5, @rate_limiter.check(Logger::WARN))
72
+ assert_redis_key(60, 3)
73
+ assert_equal(4, number_of_buckets)
74
+ end
75
+
76
+ Timecop.freeze(time + 40) do
77
+ assert_equal(6, @rate_limiter.check(Logger::WARN))
78
+ assert_redis_key(60, 4)
79
+ assert_equal(5, number_of_buckets)
80
+ end
81
+
82
+ Timecop.freeze(time + 50) do
83
+ assert_equal(7, @rate_limiter.check(Logger::WARN))
84
+ assert_redis_key(60, 5)
85
+ assert_equal(6, number_of_buckets)
86
+ end
87
+
88
+ Timecop.freeze(time + 60) do
89
+ @redis.del("#{key}:0")
90
+ assert_equal(5, number_of_buckets)
91
+
92
+ assert_equal(7, @rate_limiter.check(Logger::WARN))
93
+ assert_redis_key(60, 0)
94
+ assert_equal(6, number_of_buckets)
95
+
96
+ assert_equal(8, @rate_limiter.check(Logger::WARN))
97
+ assert_equal(1, called)
98
+ assert_equal(6, number_of_buckets)
99
+ assert_equal("1", @redis.get(@rate_limiter.callback_key))
100
+ end
101
+
102
+ Timecop.freeze(time + 70) do
103
+ @redis.del("#{key}:1")
104
+ assert_equal(7, @rate_limiter.check(Logger::WARN))
105
+ assert_nil(@redis.get(@rate_limiter.callback_key))
106
+ end
107
+ end
108
+
109
+ def test_check_with_multiple_severities
110
+ time = Time.new(2015, 1, 1, 1, 1)
111
+ Timecop.freeze(time)
112
+ called = 0
113
+
114
+ @rate_limiter = Logster::RedisRateLimiter.new(
115
+ @redis, [Logger::WARN, Logger::ERROR], 4, 60, nil, Proc.new { called += 1 }
116
+ )
117
+
118
+ assert_equal(1, @rate_limiter.check(Logger::WARN))
119
+ assert_equal(2, @rate_limiter.check(Logger::ERROR))
120
+
121
+ Timecop.freeze(time + 50) do
122
+ assert_equal(3, @rate_limiter.check(Logger::WARN))
123
+ assert_equal(4, @rate_limiter.check(Logger::ERROR))
124
+ assert_equal(2, number_of_buckets)
125
+ end
126
+
127
+ assert_equal(5, @rate_limiter.check(Logger::ERROR))
128
+ assert_equal(1, called)
129
+ end
130
+
131
+ def test_bucket_number_per_minute
132
+ time = Time.new(2015, 1, 1, 1, 1)
133
+ Timecop.freeze(time)
134
+ @rate_limiter = Logster::RedisRateLimiter.new(@redis, [Logger::WARN], 1, 60)
135
+
136
+ assert_bucket_number(0, time)
137
+ assert_bucket_number(0, time + 9)
138
+ assert_bucket_number(1, time + 11)
139
+ assert_bucket_number(5, time + 59)
140
+ end
141
+
142
+ def test_bucket_number_per_hour
143
+ time = Time.new(2015, 1, 1, 1, 0)
144
+ Timecop.freeze(time)
145
+ @rate_limiter = Logster::RedisRateLimiter.new(@redis, [Logger::WARN], 1, 3600)
146
+
147
+ assert_bucket_number(0, time)
148
+ assert_bucket_number(1, time + 1199)
149
+ assert_bucket_number(2, time + 1200)
150
+ assert_bucket_number(5, time + 3599)
151
+ end
152
+
153
+ def test_bucket_expiry
154
+ time = Time.new(2015, 1, 1, 1, 1)
155
+ Timecop.freeze(time)
156
+ @rate_limiter = Logster::RedisRateLimiter.new(@redis, [Logger::WARN], 1, 60)
157
+
158
+ assert_bucket_expiry(60, time)
159
+ assert_bucket_expiry(55, time + 5)
160
+ assert_bucket_expiry(60, time + 10)
161
+ assert_bucket_expiry(58, time + 12)
162
+ assert_bucket_expiry(55, time + 15)
163
+ assert_bucket_expiry(51, time + 19)
164
+ assert_bucket_expiry(60, time + 20)
165
+ assert_bucket_expiry(55, time + 35)
166
+ end
167
+
168
+ def test_raw_connection
169
+ time = Time.new(2015, 1, 1, 1, 1)
170
+ Timecop.freeze(time)
171
+ @rate_limiter = Logster::RedisRateLimiter.new(@redis, [Logger::WARN], 1, 60, Proc.new { "lobster" })
172
+
173
+ assert_equal(1, @rate_limiter.check(Logger::WARN))
174
+ assert_redis_key(60, 0)
175
+
176
+ toggle = true
177
+
178
+ @rate_limiter = Logster::RedisRateLimiter.new(
179
+ @redis, [Logger::WARN], 1, 60, Proc.new { toggle ? 'lobster1' : 'lobster2' }
180
+ )
181
+
182
+ assert_includes(key, "lobster1")
183
+
184
+ toggle = false
185
+ assert_includes(key, "lobster2")
186
+ end
187
+
188
+ def test_retrieve_rate
189
+ time = Time.new(2015, 1, 1, 1 , 1)
190
+ Timecop.freeze(time)
191
+
192
+ @rate_limiter = Logster::RedisRateLimiter.new(@redis, [Logger::WARN], 1, 60)
193
+
194
+ @rate_limiter.check(Logger::WARN)
195
+ assert_equal(@rate_limiter.retrieve_rate, 1)
196
+
197
+ Timecop.freeze(time + 50) do
198
+ @rate_limiter.check(Logger::WARN)
199
+ assert_equal(@rate_limiter.retrieve_rate, 2)
200
+ end
201
+ end
202
+
203
+ private
204
+
205
+ def key
206
+ @rate_limiter.key
207
+ end
208
+
209
+ def number_of_buckets
210
+ @redis.keys("#{key}:[0-#{Logster::RedisRateLimiter::BUCKETS}]").size
211
+ end
212
+
213
+ def assert_bucket_number(expected, time)
214
+ Timecop.freeze(time) do
215
+ assert_equal(expected, @rate_limiter.send(:bucket_number, Time.now.to_i))
216
+ end
217
+ end
218
+
219
+ def assert_bucket_expiry(expected, time)
220
+ Timecop.freeze(time) do
221
+ assert_equal(expected, @rate_limiter.send(:bucket_expiry, Time.now.to_i))
222
+ end
223
+ end
224
+
225
+ def assert_redis_key(expected_ttl, expected_bucket_number)
226
+ redis_key = "#{key}:#{expected_bucket_number}"
227
+ assert(@redis.get(redis_key), "the right bucket should be created")
228
+ assert_equal(expected_ttl, @redis.ttl(redis_key))
229
+ end
230
+ end