stackprof 0.2.14 → 0.2.18

Sign up to get free protection for your applications and to get access to all the features.
@@ -39,16 +39,30 @@ class StackProfTest < MiniTest::Test
39
39
  end
40
40
  assert_equal :object, profile[:mode]
41
41
  assert_equal 1, profile[:interval]
42
- assert_equal 2, profile[:samples]
42
+ if RUBY_VERSION >= '3'
43
+ assert_equal 4, profile[:samples]
44
+ else
45
+ assert_equal 2, profile[:samples]
46
+ end
43
47
 
44
48
  frame = profile[:frames].values.first
45
49
  assert_includes frame[:name], "StackProfTest#test_object_allocation"
46
50
  assert_equal 2, frame[:samples]
47
51
  assert_includes [profile_base_line - 2, profile_base_line], frame[:line]
48
- assert_equal [1, 1], frame[:lines][profile_base_line+1]
49
- assert_equal [1, 1], frame[:lines][profile_base_line+2]
52
+ if RUBY_VERSION >= '3'
53
+ assert_equal [2, 1], frame[:lines][profile_base_line+1]
54
+ assert_equal [2, 1], frame[:lines][profile_base_line+2]
55
+ else
56
+ assert_equal [1, 1], frame[:lines][profile_base_line+1]
57
+ assert_equal [1, 1], frame[:lines][profile_base_line+2]
58
+ end
50
59
  frame = profile[:frames].values[1] if RUBY_VERSION < '2.3'
51
- assert_equal [2, 0], frame[:lines][profile_base_line]
60
+
61
+ if RUBY_VERSION >= '3'
62
+ assert_equal [4, 0], frame[:lines][profile_base_line]
63
+ else
64
+ assert_equal [2, 0], frame[:lines][profile_base_line]
65
+ end
52
66
  end
53
67
 
54
68
  def test_object_allocation_interval
@@ -64,8 +78,14 @@ class StackProfTest < MiniTest::Test
64
78
  end
65
79
 
66
80
  assert_operator profile[:samples], :>=, 1
67
- frame = profile[:frames].values.first
68
- assert_includes frame[:name], "StackProfTest#math"
81
+ if RUBY_VERSION >= '3'
82
+ assert profile[:frames].values.take(2).map { |f|
83
+ f[:name].include? "StackProfTest#math"
84
+ }.any?
85
+ else
86
+ frame = profile[:frames].values.first
87
+ assert_includes frame[:name], "StackProfTest#math"
88
+ end
69
89
  end
70
90
 
71
91
  def test_walltime
@@ -74,7 +94,11 @@ class StackProfTest < MiniTest::Test
74
94
  end
75
95
 
76
96
  frame = profile[:frames].values.first
77
- assert_equal "StackProfTest#idle", frame[:name]
97
+ if RUBY_VERSION >= '3'
98
+ assert_equal "IO.select", frame[:name]
99
+ else
100
+ assert_equal "StackProfTest#idle", frame[:name]
101
+ end
78
102
  assert_in_delta 200, frame[:samples], 25
79
103
  end
80
104
 
@@ -89,24 +113,46 @@ class StackProfTest < MiniTest::Test
89
113
  assert_equal :custom, profile[:mode]
90
114
  assert_equal 10, profile[:samples]
91
115
 
92
- frame = profile[:frames].values.first
116
+ offset = RUBY_VERSION >= '3' ? 1 : 0
117
+ frame = profile[:frames].values[offset]
93
118
  assert_includes frame[:name], "StackProfTest#test_custom"
94
119
  assert_includes [profile_base_line-2, profile_base_line+1], frame[:line]
95
- assert_equal [10, 10], frame[:lines][profile_base_line+2]
120
+
121
+ if RUBY_VERSION >= '3'
122
+ assert_equal [10, 0], frame[:lines][profile_base_line+2]
123
+ else
124
+ assert_equal [10, 10], frame[:lines][profile_base_line+2]
125
+ end
96
126
  end
97
127
 
98
128
  def test_raw
129
+ before_monotonic = Process.clock_gettime(Process::CLOCK_MONOTONIC, :microsecond)
130
+
99
131
  profile = StackProf.run(mode: :custom, raw: true) do
100
132
  10.times do
101
133
  StackProf.sample
102
134
  end
103
135
  end
104
136
 
137
+ after_monotonic = Process.clock_gettime(Process::CLOCK_MONOTONIC, :microsecond)
138
+
105
139
  raw = profile[:raw]
106
140
  assert_equal 10, raw[-1]
107
141
  assert_equal raw[0] + 2, raw.size
108
- assert_includes profile[:frames][raw[-2]][:name], 'StackProfTest#test_raw'
142
+
143
+ offset = RUBY_VERSION >= '3' ? -3 : -2
144
+ assert_includes profile[:frames][raw[offset]][:name], 'StackProfTest#test_raw'
145
+
146
+ assert_equal 10, profile[:raw_sample_timestamps].size
147
+ profile[:raw_sample_timestamps].each_cons(2) do |t1, t2|
148
+ assert_operator t1, :>, before_monotonic
149
+ assert_operator t2, :>=, t1
150
+ assert_operator t2, :<, after_monotonic
151
+ end
152
+
109
153
  assert_equal 10, profile[:raw_timestamp_deltas].size
154
+ total_duration = after_monotonic - before_monotonic
155
+ assert_operator profile[:raw_timestamp_deltas].inject(&:+), :<, total_duration
110
156
  end
111
157
 
112
158
  def test_metadata
@@ -178,7 +224,6 @@ class StackProfTest < MiniTest::Test
178
224
  end
179
225
  end
180
226
 
181
- raw = profile[:raw]
182
227
  gc_frame = profile[:frames].values.find{ |f| f[:name] == "(garbage collection)" }
183
228
  marking_frame = profile[:frames].values.find{ |f| f[:name] == "(marking)" }
184
229
  sweeping_frame = profile[:frames].values.find{ |f| f[:name] == "(sweeping)" }
@@ -232,6 +277,15 @@ class StackProfTest < MiniTest::Test
232
277
  refute_empty profile[:frames]
233
278
  end
234
279
 
280
+ def test_min_max_interval
281
+ [-1, 0, 1_000_000, 1_000_001].each do |invalid_interval|
282
+ err = assert_raises(ArgumentError, "invalid interval #{invalid_interval}") do
283
+ StackProf.run(interval: invalid_interval, debug: true) {}
284
+ end
285
+ assert_match(/microseconds/, err.message)
286
+ end
287
+ end
288
+
235
289
  def math
236
290
  250_000.times do
237
291
  2 ** 10