-
Notifications
You must be signed in to change notification settings - Fork 600
/
sampled_buffer_test.rb
142 lines (110 loc) · 3.73 KB
/
sampled_buffer_test.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# encoding: utf-8
# This file is distributed under New Relic's license terms.
# See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
require File.expand_path '../../../test_helper', __FILE__
require 'new_relic/agent/event_buffer_test_cases'
module NewRelic::Agent
class SampledBufferTest < Minitest::Test
include EventBufferTestCases
def buffer_class
SampledBuffer
end
def test_replaces_old_entries_when_necessary
buffer = buffer_class.new(5)
buffer.expects(:rand).with(6).returns(0)
buffer.expects(:rand).with(7).returns(1)
buffer.expects(:rand).with(8).returns(2)
buffer.expects(:rand).with(9).returns(3)
buffer.expects(:rand).with(10).returns(4)
10.times { |i| buffer << i }
assert_equal([5, 6, 7, 8, 9], buffer.to_a)
end
def test_discards_new_entries_when_necessary
buffer = buffer_class.new(5)
buffer.expects(:rand).with(6).returns(5)
buffer.expects(:rand).with(7).returns(6)
buffer.expects(:rand).with(8).returns(7)
buffer.expects(:rand).with(9).returns(8)
buffer.expects(:rand).with(10).returns(9)
10.times { |i| buffer << i }
assert_equal([0, 1, 2, 3, 4], buffer.to_a)
end
def test_append_returns_whether_item_was_stored
buffer = buffer_class.new(5)
buffer.expects(:rand).with(6).returns(5)
5.times do |i|
result = buffer.append(i)
assert(result)
end
result = buffer.append('foo')
refute(result)
end
# This test is non-deterministic: there is some (low) probability that it will
# fail. We repeatedly stream 10 items into a buffer of capacity 5, and verify
# that each item is included ~50% of the time.
#
# Because of the non-determinism, it is possible that we'll want to disable
# this test. That said, I've thus far been unsuccessful in making it fail, so
# I'm leaving it here for now.
def test_should_sample_evenly
buffer = buffer_class.new(5)
results = []
10000.times do
buffer.reset!
10.times { |i| buffer << i }
results << buffer.to_a
end
(0...10).each do |v|
num_results_including_v = results.select { |r| r.include?(v) }.size
assert_in_delta(0.5, num_results_including_v.to_f / results.size, 0.05)
end
end
def test_seen_lifetime_should_persist_across_resets
buffer = buffer_class.new(10)
100.times { |i| buffer << i }
buffer.reset!
assert_equal(100, buffer.seen_lifetime)
100.times { |i| buffer << i }
buffer.reset!
assert_equal(200, buffer.seen_lifetime)
end
def test_sample_rate_lifetime
buffer = buffer_class.new(10)
assert_equal(0, buffer.sample_rate_lifetime)
10.times { buffer << 'x' }
buffer.reset!
assert_equal(1.0, buffer.sample_rate_lifetime)
30.times { buffer << 'x' }
buffer.reset!
assert_equal(0.5, buffer.sample_rate_lifetime)
end
def test_append_with_block
buffer = buffer_class.new(5)
5.times do |i|
buffer.append { i }
end
assert_equal [0, 1, 2, 3, 4], buffer.to_a
end
def test_append_with_block_while_sampling
buffer = buffer_class.new(5)
buffer.stubs(:rand).returns(0)
10.times do |i|
buffer.append { i }
end
assert_equal [9, 1, 2, 3, 4], buffer.to_a
end
def test_append_with_block_increments_seen
buffer = buffer_class.new(5)
10.times do |i|
buffer.append { i }
end
assert_equal 10, buffer.num_seen
end
def test_append_does_not_allow_an_argument_and_block
assert_raises ArgumentError do
buffer = buffer_class.new 5
buffer.append(4) { 5 }
end
end
end
end