Skip to content

Commit db954a1

Browse files
committed
Split test files
1 parent c8ec6ce commit db954a1

File tree

2 files changed

+161
-153
lines changed

2 files changed

+161
-153
lines changed

test/test_retained_memory.rb

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
# frozen_string_literal: true
2+
3+
require "test_helper"
4+
5+
class ReportReader
6+
attr_reader :result
7+
def initialize(result)
8+
@result = result
9+
end
10+
11+
def profile_hash
12+
@profile_hash ||= @data["profiles"][0]
13+
end
14+
15+
def frames_array
16+
@frames_array ||= @data["shared"]["frames"]
17+
end
18+
19+
def weights
20+
result.weights
21+
end
22+
23+
def total_bytes
24+
weights.sum
25+
end
26+
end
27+
28+
class TestVernier < Minitest::Test
29+
def test_that_it_has_a_version_number
30+
refute_nil ::Vernier::VERSION
31+
end
32+
33+
def test_tracing_retained_objects
34+
retained = []
35+
36+
start_line = __LINE__
37+
result = Vernier.trace_retained do
38+
100.times {
39+
Object.new
40+
41+
retained << Object.new
42+
}
43+
end
44+
45+
#reader = ReportReader.new(result)
46+
47+
assert result.total_bytes > 40 * 100
48+
assert result.total_bytes < 40 * 200
49+
50+
top_stack_tally = result.samples.tally.max_by(&:last)
51+
top_stack = result.stack(top_stack_tally.first)
52+
53+
assert_equal "Class#new", top_stack.frames[0].label
54+
assert_equal "#{self.class}##{__method__}", top_stack.frames[1].label
55+
end
56+
57+
def test_empty_block
58+
result = Vernier.trace_retained do
59+
end
60+
61+
result = ReportReader.new(result)
62+
assert result.total_bytes < 40 * 8
63+
end
64+
65+
def test_nested_collections
66+
result1 = result2 = nil
67+
result1 = Vernier.trace_retained do
68+
result2 = Vernier.trace_retained do
69+
Object.new
70+
end
71+
end
72+
73+
assert result2.samples.size > 0
74+
assert result1.samples.size > result2.samples.size
75+
end
76+
77+
def test_nothing_retained
78+
result = Vernier.trace_retained do
79+
100.times {
80+
Object.new
81+
}
82+
end
83+
84+
result = ReportReader.new(result)
85+
assert result.total_bytes < 40 * 8
86+
end
87+
88+
def test_nothing_retained_in_eval
89+
result = Vernier.trace_retained do
90+
100.times {
91+
eval "Object.new"
92+
}
93+
end
94+
95+
result = ReportReader.new(result)
96+
assert result.total_bytes < 40 * 8
97+
end
98+
99+
def build_large_module
100+
eval <<~'RUBY'
101+
mod = Module.new
102+
1.times do |i|
103+
mod.module_eval "define_singleton_method(:test#{i}) { Object.new }; test#{i}"
104+
end
105+
RUBY
106+
nil
107+
end
108+
109+
def alloc_a
110+
Object.new
111+
end
112+
113+
def alloc_b
114+
Object.new
115+
end
116+
117+
def alloc_c
118+
Object.new
119+
end
120+
121+
def test_alloc_order
122+
result = Vernier.trace_retained do
123+
alloc_a
124+
alloc_b
125+
alloc_c
126+
end
127+
128+
frames = result.each_sample.map {|stack, _| stack.frames[0] }
129+
labels = frames.map(&:label)
130+
131+
expected = %w[
132+
TestVernier#alloc_a
133+
TestVernier#alloc_b
134+
TestVernier#alloc_c
135+
]
136+
assert_equal expected, labels.grep(/#alloc_[abc]\z/)
137+
end
138+
139+
def test_nothing_retained_in_module_eval
140+
skip("WIP")
141+
142+
# Warm
143+
build_large_module
144+
145+
result = Vernier.trace_retained do
146+
# Allocate a large module
147+
build_large_module
148+
build_large_module
149+
build_large_module
150+
151+
# Do some other object allocations
152+
10_000.times { Object.new }
153+
end
154+
155+
result = ReportReader.new(result)
156+
157+
# Ideally this would be lower around 320, but in many cases it does seem to
158+
# use more memory
159+
assert_operator result.total_bytes, :<, 2500
160+
end
161+
end

test/test_vernier.rb

Lines changed: 0 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -1,162 +1,9 @@
11
# frozen_string_literal: true
22

33
require "test_helper"
4-
require "json"
5-
6-
class ReportReader
7-
attr_reader :result
8-
def initialize(result)
9-
@result = result
10-
end
11-
12-
def profile_hash
13-
@profile_hash ||= @data["profiles"][0]
14-
end
15-
16-
def frames_array
17-
@frames_array ||= @data["shared"]["frames"]
18-
end
19-
20-
def weights
21-
result.weights
22-
end
23-
24-
def total_bytes
25-
weights.sum
26-
end
27-
end
284

295
class TestVernier < Minitest::Test
306
def test_that_it_has_a_version_number
317
refute_nil ::Vernier::VERSION
328
end
33-
34-
def test_tracing_retained_objects
35-
retained = []
36-
37-
start_line = __LINE__
38-
result = Vernier.trace_retained do
39-
100.times {
40-
Object.new
41-
42-
retained << Object.new
43-
}
44-
end
45-
46-
#reader = ReportReader.new(result)
47-
48-
assert result.total_bytes > 40 * 100
49-
assert result.total_bytes < 40 * 200
50-
51-
top_stack_tally = result.samples.tally.max_by(&:last)
52-
top_stack = result.stack(top_stack_tally.first)
53-
54-
assert_equal "Class#new", top_stack.frames[0].label
55-
assert_equal "#{self.class}##{__method__}", top_stack.frames[1].label
56-
end
57-
58-
def test_empty_block
59-
result = Vernier.trace_retained do
60-
end
61-
62-
result = ReportReader.new(result)
63-
assert result.total_bytes < 40 * 8
64-
end
65-
66-
def test_nested_collections
67-
result1 = result2 = nil
68-
result1 = Vernier.trace_retained do
69-
result2 = Vernier.trace_retained do
70-
Object.new
71-
end
72-
end
73-
74-
assert result2.samples.size > 0
75-
assert result1.samples.size > result2.samples.size
76-
end
77-
78-
def test_nothing_retained
79-
result = Vernier.trace_retained do
80-
100.times {
81-
Object.new
82-
}
83-
end
84-
85-
result = ReportReader.new(result)
86-
assert result.total_bytes < 40 * 8
87-
end
88-
89-
def test_nothing_retained_in_eval
90-
result = Vernier.trace_retained do
91-
100.times {
92-
eval "Object.new"
93-
}
94-
end
95-
96-
result = ReportReader.new(result)
97-
assert result.total_bytes < 40 * 8
98-
end
99-
100-
def build_large_module
101-
eval <<~'RUBY'
102-
mod = Module.new
103-
1.times do |i|
104-
mod.module_eval "define_singleton_method(:test#{i}) { Object.new }; test#{i}"
105-
end
106-
RUBY
107-
nil
108-
end
109-
110-
def alloc_a
111-
Object.new
112-
end
113-
114-
def alloc_b
115-
Object.new
116-
end
117-
118-
def alloc_c
119-
Object.new
120-
end
121-
122-
def test_alloc_order
123-
result = Vernier.trace_retained do
124-
alloc_a
125-
alloc_b
126-
alloc_c
127-
end
128-
129-
frames = result.each_sample.map {|stack, _| stack.frames[0] }
130-
labels = frames.map(&:label)
131-
132-
expected = %w[
133-
TestVernier#alloc_a
134-
TestVernier#alloc_b
135-
TestVernier#alloc_c
136-
]
137-
assert_equal expected, labels.grep(/#alloc_[abc]\z/)
138-
end
139-
140-
def test_nothing_retained_in_module_eval
141-
skip("WIP")
142-
143-
# Warm
144-
build_large_module
145-
146-
result = Vernier.trace_retained do
147-
# Allocate a large module
148-
build_large_module
149-
build_large_module
150-
build_large_module
151-
152-
# Do some other object allocations
153-
10_000.times { Object.new }
154-
end
155-
156-
result = ReportReader.new(result)
157-
158-
# Ideally this would be lower around 320, but in many cases it does seem to
159-
# use more memory
160-
assert_operator result.total_bytes, :<, 2500
161-
end
1629
end

0 commit comments

Comments
 (0)