File: pause_resume_test.rb

package info (click to toggle)
ruby-prof 0.17.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 1,656 kB
  • sloc: ruby: 5,043; ansic: 2,175; makefile: 6
file content (166 lines) | stat: -rwxr-xr-x 4,439 bytes parent folder | download | duplicates (2)
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#!/usr/bin/env ruby
# encoding: UTF-8

require File.expand_path('../test_helper', __FILE__)

class PauseResumeTest < TestCase
  def setup
    # Need to use wall time for this test due to the sleep calls
    RubyProf::measure_mode = RubyProf::WALL_TIME
  end

  def test_pause_resume
    # Measured
    RubyProf.start
    RubyProf::C1.hello

    # Not measured
    RubyProf.pause
    sleep 1
    RubyProf::C1.hello

    # Measured
    RubyProf.resume
    RubyProf::C1.hello

    result = RubyProf.stop

    # Length should be 3:
    #   PauseResumeTest#test_pause_resume
    #   <Class::RubyProf::C1>#hello
    #   Kernel#sleep

    methods = result.threads.first.methods.sort_by {|method_info| method_info.full_name}
    # remove methods called by pause/resume
    called_methods = ['Array#include?', 'Fixnum#==', 'Kernel#respond_to?', 'Kernel#respond_to_missing?']
    methods.reject!{|m| called_methods.include?(m.full_name) }
    # TODO: fix pause/resume to not include those methods in the first place
    assert_equal(3, methods.length)

    # Check the names
    assert_equal('<Class::RubyProf::C1>#hello', methods[0].full_name)
    assert_equal('Kernel#sleep', methods[1].full_name)
    assert_equal('PauseResumeTest#test_pause_resume', methods[2].full_name)

    # Check times
    assert_in_delta(0.2, methods[0].total_time, 0.02)
    assert_in_delta(0, methods[0].wait_time, 0.02)
    assert_in_delta(0, methods[0].self_time, 0.02)

    assert_in_delta(0.2, methods[1].total_time, 0.02)
    assert_in_delta(0, methods[1].wait_time, 0.02)
    assert_in_delta(0.2, methods[1].self_time, 0.02)

    assert_in_delta(0.2, methods[2].total_time, 0.02)
    assert_in_delta(0, methods[2].wait_time, 0.02)
    assert_in_delta(0, methods[2].self_time, 0.02)
  end

  # pause/resume in the same frame
  def test_pause_resume_1
    profile = RubyProf::Profile.new

    profile.start
    method_1a

    profile.pause
    method_1b

    profile.resume
    method_1c

    result = profile.stop
    assert_in_delta(0.6, result.threads[0].methods.select{|m| m.full_name =~ /test_pause_resume_1$/}[0].total_time, 0.05)
  end
  def method_1a; sleep 0.2 end
  def method_1b; sleep 1   end
  def method_1c; sleep 0.4 end

  # pause in parent frame, resume in child
  def test_pause_resume_2
    profile = RubyProf::Profile.new

    profile.start
    method_2a

    profile.pause
    sleep 0.5
    method_2b(profile)

    result = profile.stop
    assert_in_delta(0.6, result.threads[0].methods.select{|m| m.full_name =~ /test_pause_resume_2$/}[0].total_time, 0.05)
  end
  def method_2a; sleep 0.2 end
  def method_2b(profile); sleep 0.5; profile.resume; sleep 0.4 end

  # pause in child frame, resume in parent
  def test_pause_resume_3
    profile = RubyProf::Profile.new

    profile.start
    method_3a(profile)

    sleep 0.5
    profile.resume
    method_3b

    result = profile.stop
    assert_in_delta(0.6, result.threads[0].methods.select{|m| m.full_name =~ /test_pause_resume_3$/}[0].total_time, 0.05)
  end
  def method_3a(profile); sleep 0.2; profile.pause; sleep 0.5 end
  def method_3b; sleep 0.4 end

  def test_pause_seq
    profile = RubyProf::Profile.new
    profile.start ; assert !profile.paused?
    profile.pause ; assert profile.paused?
    profile.resume; assert !profile.paused?
    profile.pause ; assert profile.paused?
    profile.pause ; assert profile.paused?
    profile.resume; assert !profile.paused?
    profile.resume; assert !profile.paused?
    profile.stop  ; assert !profile.paused?
  end

  def test_pause_block
    profile = RubyProf::Profile.new
    profile.start
    profile.pause
    assert profile.paused?

    times_block_invoked = 0
    retval= profile.resume{
      times_block_invoked += 1
      120 + times_block_invoked
    }
    assert_equal 1, times_block_invoked
    assert profile.paused?

    assert_equal 121, retval, "resume() should return the result of the given block."

    profile.stop
  end

  def test_pause_block_with_error
    profile = RubyProf::Profile.new
    profile.start
    profile.pause
    assert profile.paused?

    begin
      profile.resume{ raise }
      flunk 'Exception expected.'
    rescue
      assert profile.paused?
    end

    profile.stop
  end

  def test_resume_when_not_paused
    profile = RubyProf::Profile.new
    profile.start ; assert !profile.paused?
    profile.resume; assert !profile.paused?
    profile.stop  ; assert !profile.paused?
  end
end