File: method_elimination_test.rb

package info (click to toggle)
ruby-prof 0.16.2%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 1,680 kB
  • ctags: 972
  • sloc: ruby: 4,552; ansic: 1,888; makefile: 6
file content (84 lines) | stat: -rwxr-xr-x 2,377 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
#!/usr/bin/env ruby
# encoding: UTF-8

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

# Test data
#     A
#    / \
#   B   C
#        \
#         B

module MethodElimination
  def self.a
    1.times {|i| c}
  end

  def self.b
    sleep 0.1
  end

  def self.c
    1.times {|i| b}
  end
end

class MethodEliminationTest < 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_setting_parent
    result = RubyProf.profile do
      1000.times { 1+1 }
    end
    method_infos = result.threads.first.methods.sort.reverse
    assert(m1 = method_infos[0])
    assert(c1 = m1.call_infos.first)
    assert_nil(c1.parent)
  end

  def test_methods_can_be_eliminated
    RubyProf.start
    5.times {MethodElimination.a}
    result = RubyProf.stop

    methods = result.threads.first.methods.sort.reverse

    assert_equal(6, methods.count)
    assert_equal('MethodEliminationTest#test_methods_can_be_eliminated', methods[0].full_name)
    assert_equal('Integer#times', methods[1].full_name)
    assert_equal('<Module::MethodElimination>#a', methods[2].full_name)
    assert_equal('<Module::MethodElimination>#c', methods[3].full_name)
    assert_equal('<Module::MethodElimination>#b', methods[4].full_name)
    assert_equal('Kernel#sleep', methods[5].full_name)

    result.eliminate_methods!([/Integer#times/])

    methods = result.threads.first.methods.sort.reverse
    assert_equal(5, methods.count)
    assert_equal('MethodEliminationTest#test_methods_can_be_eliminated', methods[0].full_name)
    assert_equal('<Module::MethodElimination>#a', methods[1].full_name)
    assert_equal('<Module::MethodElimination>#c', methods[2].full_name)
    assert_equal('<Module::MethodElimination>#b', methods[3].full_name)
    assert_equal('Kernel#sleep', methods[4].full_name)
  end

  private

  def assert_method_has_been_eliminated(result, eliminated_method)
    result.threads.each do |thread|
      thread.methods.each do |method|
        method.call_infos.each do |ci|
          assert(ci.target != eliminated_method, "broken self")
          assert(ci.parent.target != eliminated_method, "broken parent") if ci.parent
          ci.children.each do |callee|
            assert(callee.target != eliminated_method, "broken kid")
          end
        end
      end
    end
  end
end