pulse_meter_core 0.5.3 → 0.5.4
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.
- checksums.yaml +5 -13
- data/.rbenv-version +1 -1
- data/.travis.yml +2 -0
- data/pulse_meter_core.gemspec +1 -1
- data/spec/pulse_meter/command_aggregator/async_spec.rb +14 -14
- data/spec/pulse_meter/command_aggregator/sync_spec.rb +5 -5
- data/spec/pulse_meter/command_aggregator/udp_spec.rb +8 -8
- data/spec/pulse_meter/mixins/dumper_spec.rb +27 -27
- data/spec/pulse_meter/mixins/utils_spec.rb +64 -64
- data/spec/pulse_meter/observer/extended_spec.rb +20 -20
- data/spec/pulse_meter/observer_spec.rb +26 -26
- data/spec/pulse_meter/sensor/base_spec.rb +25 -25
- data/spec/pulse_meter/sensor/configuration_spec.rb +21 -21
- data/spec/pulse_meter/sensor/counter_spec.rb +12 -12
- data/spec/pulse_meter/sensor/hashed_counter_spec.rb +9 -9
- data/spec/pulse_meter/sensor/hashed_indicator_spec.rb +10 -10
- data/spec/pulse_meter/sensor/indicator_spec.rb +9 -9
- data/spec/pulse_meter/sensor/multi_spec.rb +13 -13
- data/spec/pulse_meter/sensor/timeline_spec.rb +12 -12
- data/spec/pulse_meter/sensor/timelined/multi_percentile_spec.rb +2 -2
- data/spec/pulse_meter/sensor/timelined/percentile_spec.rb +1 -1
- data/spec/pulse_meter/sensor/uniq_counter_spec.rb +5 -5
- data/spec/pulse_meter/udp_server_spec.rb +9 -9
- data/spec/pulse_meter_spec.rb +21 -21
- data/spec/shared_examples/timeline_sensor.rb +88 -88
- data/spec/shared_examples/timelined_subclass.rb +2 -2
- data/spec/spec_helper.rb +2 -0
- data/spec/support/matchers.rb +2 -2
- metadata +34 -34
@@ -21,14 +21,14 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
|
|
21
21
|
before(:each) do
|
22
22
|
@now = Time.now
|
23
23
|
tc = PulseMeter::TimeConverter.new(timezone)
|
24
|
-
|
24
|
+
|
25
25
|
@redis_now = tc.to_redis(@now).to_i
|
26
26
|
|
27
27
|
@interval_id = (@redis_now / interval) * interval
|
28
28
|
@prev_interval_id = (@redis_now / interval) * interval - interval
|
29
29
|
|
30
30
|
@raw_data_key = sensor.raw_data_key(@interval_id)
|
31
|
-
|
31
|
+
|
32
32
|
@prev_raw_data_key = sensor.raw_data_key(@prev_interval_id)
|
33
33
|
|
34
34
|
@next_raw_data_key = sensor.raw_data_key(@interval_id + interval)
|
@@ -38,7 +38,7 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
|
|
38
38
|
end
|
39
39
|
|
40
40
|
describe "#dump" do
|
41
|
-
it "
|
41
|
+
it "is dumped succesfully" do
|
42
42
|
expect {sensor.dump!}.not_to raise_exception
|
43
43
|
end
|
44
44
|
end
|
@@ -50,35 +50,35 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
|
|
50
50
|
@restored = base_class.restore(sensor.name)
|
51
51
|
end
|
52
52
|
|
53
|
-
it "
|
54
|
-
@restored.
|
53
|
+
it "restores #{described_class} instance" do
|
54
|
+
expect(@restored).to be_instance_of(described_class)
|
55
55
|
end
|
56
56
|
|
57
|
-
it "
|
57
|
+
it "restores object with the same data" do
|
58
58
|
def inner_data(obj)
|
59
59
|
obj.instance_variables.sort.map {|v| obj.instance_variable_get(v)}
|
60
60
|
end
|
61
61
|
|
62
|
-
inner_data(sensor).
|
62
|
+
expect(inner_data(sensor)).to eq(inner_data(@restored))
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
66
|
describe "#event" do
|
67
|
-
it "
|
67
|
+
it "writes events to redis" do
|
68
68
|
expect{
|
69
69
|
sensor.event(sample_event)
|
70
70
|
}.to change{ redis.keys('*').count }.by(1)
|
71
71
|
end
|
72
72
|
|
73
|
-
it "
|
73
|
+
it "writes data so that it totally expires after :raw_data_ttl" do
|
74
74
|
key_count = redis.keys('*').count
|
75
75
|
sensor.event(sample_event)
|
76
76
|
Timecop.freeze(@now + raw_data_ttl + 1) do
|
77
|
-
redis.keys('*').count.
|
77
|
+
expect(redis.keys('*').count).to eq(key_count)
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
-
it "
|
81
|
+
it "writes data to bucket indicated by truncated timestamp" do
|
82
82
|
expect{
|
83
83
|
Timecop.freeze(@start_of_interval) do
|
84
84
|
sensor.event(sample_event)
|
@@ -87,32 +87,32 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
|
|
87
87
|
end
|
88
88
|
|
89
89
|
it "returns true if event processed correctly" do
|
90
|
-
sensor.event(sample_event).
|
90
|
+
expect(sensor.event(sample_event)).to be
|
91
91
|
end
|
92
92
|
|
93
93
|
it "catches StandardErrors and returns false" do
|
94
|
-
sensor.
|
95
|
-
sensor.event(sample_event).
|
94
|
+
allow(sensor).to receive(:aggregate_event) {raise StandardError}
|
95
|
+
expect(sensor.event(sample_event)).not_to be
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
99
99
|
describe "#event_at" do
|
100
100
|
let(:now) {@now}
|
101
|
-
it "
|
101
|
+
it "writes events to redis" do
|
102
102
|
expect{
|
103
103
|
sensor.event_at(now, sample_event)
|
104
104
|
}.to change{ redis.keys('*').count }.by(1)
|
105
105
|
end
|
106
106
|
|
107
|
-
it "
|
107
|
+
it "writes data so that it totally expires after :raw_data_ttl" do
|
108
108
|
key_count = redis.keys('*').count
|
109
109
|
sensor.event_at(now, sample_event)
|
110
110
|
Timecop.freeze(now + raw_data_ttl + 1) do
|
111
|
-
redis.keys('*').count.
|
111
|
+
expect(redis.keys('*').count).to eq(key_count)
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
|
-
it "
|
115
|
+
it "writes data to bucket indicated by passed time" do
|
116
116
|
expect{
|
117
117
|
Timecop.freeze(@start_of_interval) do
|
118
118
|
sensor.event_at(@start_of_prev_interval, sample_event)
|
@@ -122,65 +122,65 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
|
|
122
122
|
end
|
123
123
|
|
124
124
|
describe "#summarize" do
|
125
|
-
it "
|
125
|
+
it "converts data stored by raw_data_key to a value defined only by stored data" do
|
126
126
|
Timecop.freeze(@start_of_interval) do
|
127
127
|
sensor.event(sample_event)
|
128
128
|
end
|
129
129
|
Timecop.freeze(@start_of_interval + interval) do
|
130
130
|
sensor.event(sample_event)
|
131
131
|
end
|
132
|
-
sensor.summarize(@raw_data_key).
|
133
|
-
sensor.summarize(@raw_data_key).
|
132
|
+
expect(sensor.summarize(@raw_data_key)).to eq(sensor.summarize(@next_raw_data_key))
|
133
|
+
expect(sensor.summarize(@raw_data_key)).not_to be_nil
|
134
134
|
end
|
135
135
|
end
|
136
136
|
|
137
137
|
describe "#reduce" do
|
138
|
-
it "
|
138
|
+
it "stores summarized value into data_key" do
|
139
139
|
Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
|
140
140
|
val = sensor.summarize(@raw_data_key)
|
141
|
-
val.
|
141
|
+
expect(val).not_to be_nil
|
142
142
|
sensor.reduce(@interval_id)
|
143
|
-
redis.get(sensor.data_key(@interval_id)).
|
143
|
+
expect(redis.get(sensor.data_key(@interval_id))).to eq(val.to_s)
|
144
144
|
end
|
145
145
|
|
146
|
-
it "
|
146
|
+
it "removes original raw_data_key" do
|
147
147
|
Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
|
148
148
|
expect{
|
149
149
|
sensor.reduce(@interval_id)
|
150
150
|
}.to change{ redis.keys(sensor.raw_data_key(@interval_id)).count }.from(1).to(0)
|
151
151
|
end
|
152
152
|
|
153
|
-
it "
|
153
|
+
it "expires stored summarized data" do
|
154
154
|
Timecop.freeze(@start_of_interval) do
|
155
155
|
sensor.event(sample_event)
|
156
156
|
sensor.reduce(@interval_id)
|
157
|
-
redis.keys(sensor.data_key(@interval_id)).count.
|
157
|
+
expect(redis.keys(sensor.data_key(@interval_id)).count).to eq(1)
|
158
158
|
end
|
159
159
|
Timecop.freeze(@start_of_interval + ttl + 1) do
|
160
|
-
redis.keys(sensor.data_key(@interval_id)).count.
|
160
|
+
expect(redis.keys(sensor.data_key(@interval_id)).count).to eq(0)
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
|
-
it "
|
164
|
+
it "does not store data if there is no corresponding raw data" do
|
165
165
|
Timecop.freeze(@start_of_interval) do
|
166
166
|
sensor.reduce(@interval_id)
|
167
|
-
redis.keys(sensor.data_key(@interval_id)).count.
|
167
|
+
expect(redis.keys(sensor.data_key(@interval_id)).count).to eq(0)
|
168
168
|
end
|
169
169
|
end
|
170
170
|
|
171
|
-
it "
|
171
|
+
it "does not store summarized data if it already exists" do
|
172
172
|
data_key = sensor.data_key(@interval_id)
|
173
173
|
redis.set(data_key, :dummy)
|
174
174
|
Timecop.freeze(@start_of_interval) do
|
175
175
|
sensor.event(sample_event)
|
176
176
|
sensor.reduce(@interval_id)
|
177
|
-
redis.get(data_key).
|
177
|
+
expect(redis.get(data_key)).to eq("dummy")
|
178
178
|
end
|
179
179
|
end
|
180
180
|
end
|
181
181
|
|
182
182
|
describe "#reduce_all_raw" do
|
183
|
-
it "
|
183
|
+
it "reduces all data older than reduce_delay" do
|
184
184
|
Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
|
185
185
|
val0 = sensor.summarize(@raw_data_key)
|
186
186
|
Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
|
@@ -191,8 +191,8 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
|
|
191
191
|
end
|
192
192
|
}.to change{ redis.keys(sensor.raw_data_key('*')).count }.from(2).to(0)
|
193
193
|
|
194
|
-
redis.get(sensor.data_key(@interval_id)).
|
195
|
-
redis.get(sensor.data_key(@interval_id + interval)).
|
194
|
+
expect(redis.get(sensor.data_key(@interval_id))).to eq(val0.to_s)
|
195
|
+
expect(redis.get(sensor.data_key(@interval_id + interval))).to eq(val1.to_s)
|
196
196
|
end
|
197
197
|
|
198
198
|
it "creates up to MAX_INTERVALS compresed data pieces from previously uncompressed data" do
|
@@ -209,7 +209,7 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
|
|
209
209
|
end
|
210
210
|
end
|
211
211
|
|
212
|
-
it "
|
212
|
+
it "does not reduce fresh data" do
|
213
213
|
Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
|
214
214
|
|
215
215
|
expect{
|
@@ -223,181 +223,181 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
|
|
223
223
|
end
|
224
224
|
|
225
225
|
describe ".reduce_all_raw" do
|
226
|
-
it "
|
226
|
+
it "silently skips objects without reduce logic" do
|
227
227
|
dummy.dump!
|
228
228
|
expect {described_class.reduce_all_raw}.not_to raise_exception
|
229
229
|
end
|
230
230
|
|
231
|
-
it "
|
232
|
-
described_class.
|
231
|
+
it "sends reduce_all_raw to all dumped objects" do
|
232
|
+
expect_any_instance_of(described_class).to receive(:reduce_all_raw)
|
233
233
|
described_class.reduce_all_raw
|
234
234
|
end
|
235
235
|
end
|
236
236
|
|
237
237
|
describe "#timeline_within" do
|
238
|
-
it "
|
238
|
+
it "raises exception unless both arguments are Time objects" do
|
239
239
|
[:q, nil, -1].each do |bad_value|
|
240
240
|
expect{ sensor.timeline_within(@now, bad_value) }.to raise_exception(ArgumentError)
|
241
241
|
expect{ sensor.timeline_within(bad_value, @now) }.to raise_exception(ArgumentError)
|
242
242
|
end
|
243
243
|
end
|
244
244
|
|
245
|
-
it "
|
245
|
+
it "returns an array of SensorData objects corresponding to stored data for passed interval" do
|
246
246
|
sensor.event(sample_event)
|
247
247
|
now = @now
|
248
248
|
timeline = sensor.timeline_within(now - 1, now)
|
249
|
-
timeline.
|
250
|
-
timeline.each{|i| i.
|
249
|
+
expect(timeline).to be_kind_of(Array)
|
250
|
+
timeline.each{|i| expect(i).to be_kind_of(SensorData) }
|
251
251
|
end
|
252
252
|
|
253
|
-
it "
|
253
|
+
it "returns array of results containing as many results as there are sensor interval beginnings in the passed interval" do
|
254
254
|
Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
|
255
255
|
Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
|
256
256
|
|
257
257
|
future = @start_of_interval + 3600
|
258
258
|
Timecop.freeze(future) do
|
259
|
-
sensor.timeline_within(
|
259
|
+
expect(sensor.timeline_within(
|
260
260
|
Time.at(@start_of_interval + interval - 1),
|
261
261
|
Time.at(@start_of_interval + interval + 1)
|
262
|
-
).size.
|
262
|
+
).size).to eq(1)
|
263
263
|
|
264
|
-
sensor.timeline_within(
|
264
|
+
expect(sensor.timeline_within(
|
265
265
|
Time.at(@start_of_interval - 1),
|
266
266
|
Time.at(@start_of_interval + interval + 1)
|
267
|
-
).size.
|
267
|
+
).size).to eq(2)
|
268
268
|
end
|
269
269
|
|
270
270
|
Timecop.freeze(@start_of_interval + interval + 2) do
|
271
|
-
sensor.timeline_within(
|
271
|
+
expect(sensor.timeline_within(
|
272
272
|
Time.at(@start_of_interval + interval + 1),
|
273
273
|
Time.at(@start_of_interval + interval + 2)
|
274
|
-
).size.
|
274
|
+
).size).to eq(0)
|
275
275
|
end
|
276
276
|
end
|
277
277
|
|
278
278
|
context "to avoid getting to much data" do
|
279
279
|
let(:max) {PulseMeter::Sensor::Timeline::MAX_TIMESPAN_POINTS}
|
280
280
|
|
281
|
-
it "
|
281
|
+
it "skips some points not to exceed MAX_TIMESPAN_POINTS" do
|
282
282
|
count = max * 2
|
283
|
-
sensor.timeline_within(
|
283
|
+
expect(sensor.timeline_within(
|
284
284
|
Time.at(@start_of_interval - 1),
|
285
285
|
Time.at(@start_of_interval + count * interval)
|
286
|
-
).size.
|
286
|
+
).size).to be < max
|
287
287
|
end
|
288
288
|
|
289
|
-
it "
|
289
|
+
it "does not skip any points when timeline orginal size is less then MAX_TIMESPAN_POINTS" do
|
290
290
|
count = max - 1
|
291
|
-
sensor.timeline_within(
|
291
|
+
expect(sensor.timeline_within(
|
292
292
|
Time.at(@start_of_interval - 1),
|
293
293
|
Time.at(@start_of_interval + count * interval)
|
294
|
-
).size.
|
294
|
+
).size).to eq(count)
|
295
295
|
end
|
296
296
|
|
297
|
-
it "
|
297
|
+
it "does give full data in case skip_optimization parameter set to true" do
|
298
298
|
count = max * 2
|
299
|
-
sensor.timeline_within(
|
299
|
+
expect(sensor.timeline_within(
|
300
300
|
Time.at(@start_of_interval - 1),
|
301
301
|
Time.at(@start_of_interval + count * interval),
|
302
302
|
true
|
303
|
-
).size.
|
303
|
+
).size).to eq(count)
|
304
304
|
end
|
305
305
|
end
|
306
306
|
end
|
307
307
|
|
308
308
|
describe "#timeline" do
|
309
|
-
it "
|
309
|
+
it "raises exception if passed interval is not a positive integer" do
|
310
310
|
[:q, nil, -1].each do |bad_interval|
|
311
311
|
expect{ sensor.timeline(bad_interval) }.to raise_exception(ArgumentError)
|
312
312
|
end
|
313
313
|
end
|
314
314
|
|
315
|
-
it "
|
315
|
+
it "requests timeline within interval from given number of seconds ago till now" do
|
316
316
|
Timecop.freeze(@now) do
|
317
317
|
now = @now
|
318
318
|
ago = interval * 100
|
319
|
-
sensor.timeline(ago).
|
319
|
+
expect(sensor.timeline(ago)).to eq(sensor.timeline_within(now - ago, now))
|
320
320
|
end
|
321
321
|
end
|
322
322
|
|
323
|
-
it "
|
323
|
+
it "returns array of results containing as many results as there are sensor interval beginnings in the passed interval" do
|
324
324
|
Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
|
325
325
|
Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
|
326
326
|
|
327
327
|
Timecop.freeze(@start_of_interval + interval + 1) do
|
328
|
-
sensor.timeline(2).size.
|
328
|
+
expect(sensor.timeline(2).size).to eq(1)
|
329
329
|
end
|
330
330
|
Timecop.freeze(@start_of_interval + interval + 2) do
|
331
|
-
sensor.timeline(1).size.
|
331
|
+
expect(sensor.timeline(1).size).to eq(0)
|
332
332
|
end
|
333
333
|
Timecop.freeze(@start_of_interval + interval + 1) do
|
334
|
-
sensor.timeline(2 + interval).size.
|
334
|
+
expect(sensor.timeline(2 + interval).size).to eq(2)
|
335
335
|
end
|
336
336
|
end
|
337
337
|
end
|
338
338
|
|
339
339
|
describe "#drop_within" do
|
340
|
-
it "
|
340
|
+
it "raises exception unless both arguments are Time objects" do
|
341
341
|
[:q, nil, -1].each do |bad_value|
|
342
342
|
expect{ sensor.drop_within(@now, bad_value) }.to raise_exception(ArgumentError)
|
343
343
|
expect{ sensor.drop_within(bad_value, @now) }.to raise_exception(ArgumentError)
|
344
344
|
end
|
345
345
|
end
|
346
346
|
|
347
|
-
it "
|
347
|
+
it "drops as many raw results as there are sensor interval beginnings in the passed interval" do
|
348
348
|
Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
|
349
349
|
Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
|
350
350
|
|
351
351
|
future = @start_of_interval + interval * 3
|
352
352
|
Timecop.freeze(future) do
|
353
|
-
sensor.drop_within(
|
353
|
+
expect(sensor.drop_within(
|
354
354
|
Time.at(@start_of_interval + interval - 1),
|
355
355
|
Time.at(@start_of_interval + interval + 1)
|
356
|
-
).
|
356
|
+
)).to eq(1)
|
357
357
|
|
358
358
|
data = sensor.timeline_within(
|
359
359
|
Time.at(@start_of_interval + interval - 1),
|
360
360
|
Time.at(@start_of_interval + interval + 1)
|
361
361
|
)
|
362
|
-
data.size.
|
363
|
-
data.first.value.
|
362
|
+
expect(data.size).to eq(1)
|
363
|
+
expect(data.first.value).to be_nil # since data is dropped
|
364
364
|
|
365
365
|
end
|
366
366
|
|
367
367
|
Timecop.freeze(@start_of_interval + interval + 2) do
|
368
|
-
sensor.drop_within(
|
368
|
+
expect(sensor.drop_within(
|
369
369
|
Time.at(@start_of_interval + interval + 1),
|
370
370
|
Time.at(@start_of_interval + interval + 2)
|
371
|
-
).
|
371
|
+
)).to eq(0)
|
372
372
|
end
|
373
373
|
end
|
374
374
|
|
375
|
-
it "
|
375
|
+
it "drops as many reduced results as there are sensor interval beginnings in the passed interval" do
|
376
376
|
Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
|
377
377
|
Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
|
378
378
|
|
379
379
|
future = @start_of_interval
|
380
380
|
Timecop.freeze(future) do
|
381
381
|
sensor.reduce_all_raw
|
382
|
-
sensor.drop_within(
|
382
|
+
expect(sensor.drop_within(
|
383
383
|
Time.at(@start_of_interval + interval - 1),
|
384
384
|
Time.at(@start_of_interval + interval + 1)
|
385
|
-
).
|
385
|
+
)).to eq(1)
|
386
386
|
|
387
387
|
data = sensor.timeline_within(
|
388
388
|
Time.at(@start_of_interval + interval - 1),
|
389
389
|
Time.at(@start_of_interval + interval + 1)
|
390
390
|
)
|
391
|
-
data.size.
|
392
|
-
data.first.value.
|
391
|
+
expect(data.size).to eq(1)
|
392
|
+
expect(data.first.value).to be_nil # since data is dropped
|
393
393
|
|
394
394
|
end
|
395
395
|
|
396
396
|
Timecop.freeze(@start_of_interval + interval + 2) do
|
397
|
-
sensor.drop_within(
|
397
|
+
expect(sensor.drop_within(
|
398
398
|
Time.at(@start_of_interval + interval + 1),
|
399
399
|
Time.at(@start_of_interval + interval + 2)
|
400
|
-
).
|
400
|
+
)).to eq(0)
|
401
401
|
end
|
402
402
|
end
|
403
403
|
end
|
@@ -405,11 +405,11 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
|
|
405
405
|
describe "SensorData value for an interval" do
|
406
406
|
def check_sensor_data(sensor, value)
|
407
407
|
data = sensor.timeline(2).first
|
408
|
-
data.value.
|
409
|
-
data.start_time.to_i.
|
408
|
+
expect(data.value).to be_generally_equal(sensor.deflate_safe(value))
|
409
|
+
expect(data.start_time.to_i).to eq(@start_of_interval.to_i)
|
410
410
|
end
|
411
411
|
|
412
|
-
it "
|
412
|
+
it "contains summarized value stored by data_key for reduced intervals" do
|
413
413
|
Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
|
414
414
|
sensor.reduce(@interval_id)
|
415
415
|
Timecop.freeze(@start_of_interval + 1){
|
@@ -417,14 +417,14 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
|
|
417
417
|
}
|
418
418
|
end
|
419
419
|
|
420
|
-
it "
|
420
|
+
it "contains summarized value based on raw data for intervals not yet reduced" do
|
421
421
|
Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
|
422
422
|
Timecop.freeze(@start_of_interval + 1){
|
423
423
|
check_sensor_data(sensor, sensor.summarize(@raw_data_key))
|
424
424
|
}
|
425
425
|
end
|
426
426
|
|
427
|
-
it "
|
427
|
+
it "contains nil for intervals without any data" do
|
428
428
|
Timecop.freeze(@start_of_interval + 1) {
|
429
429
|
check_sensor_data(sensor, nil)
|
430
430
|
}
|
@@ -432,14 +432,14 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
|
|
432
432
|
end
|
433
433
|
|
434
434
|
describe "#cleanup" do
|
435
|
-
it "
|
435
|
+
it "removes all sensor data (raw data, reduced data, annotations) from redis" do
|
436
436
|
Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
|
437
437
|
sensor.reduce(@interval_id)
|
438
438
|
Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
|
439
439
|
sensor.annotate("Fooo sensor")
|
440
440
|
|
441
441
|
sensor.cleanup
|
442
|
-
redis.keys('*').
|
442
|
+
expect(redis.keys('*')).to be_empty
|
443
443
|
end
|
444
444
|
end
|
445
445
|
|