logster 1.3.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
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