diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-05-25 00:41:18 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-05-25 00:41:18 +0000 |
commit | 0be4ec01cd5f9d517afd86f1c5f7a9922e6dfae3 (patch) | |
tree | 4d9186dc3b6907c8a1bdbad1a64e80bf1bee8ede /test/lib/minitest | |
parent | bb64a9617813d8e1bf18c531d7cbaa19bfb5e5a0 (diff) |
* test/lib/minitest/unit.rb: Show leakes threads and tempfiles.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46089 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/lib/minitest')
-rw-r--r-- | test/lib/minitest/unit.rb | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/test/lib/minitest/unit.rb b/test/lib/minitest/unit.rb index c6489ba01e..6f686ac85e 100644 --- a/test/lib/minitest/unit.rb +++ b/test/lib/minitest/unit.rb @@ -927,6 +927,8 @@ module MiniTest inst = suite.new method inst._assertions = 0 + live1 = live_thread_and_tempfile + print "#{suite}##{method} = " if @verbose start_time = Time.now if @verbose @@ -936,12 +938,45 @@ module MiniTest print result puts if @verbose + check_tempfile_and_thread inst, live1 + inst._assertions } return assertions.size, assertions.inject(0) { |sum, n| sum + n } end + def live_thread_and_tempfile + live_threads = ObjectSpace.each_object(Thread).find_all {|t| + t != Thread.current && t.alive? + } + if defined? Tempfile + live_tempfiles = ObjectSpace.each_object(Tempfile).find_all {|t| + t.path + } + else + live_tempfiles = [] + end + [live_threads, live_tempfiles] + end + + def check_tempfile_and_thread(inst, live1) + live2 = live_thread_and_tempfile + thread_finished = live1[0] - live2[0] + if !thread_finished.empty? + puts "Finished threads: #{inst.class}\##{inst.__name__}:#{thread_finished.map {|t| ' ' + t.inspect }.join}" + end + thread_retained = live2[0] - live1[0] + if !thread_retained.empty? + puts "Leaked threads: #{inst.class}\##{inst.__name__}:#{thread_retained.map {|t| ' ' + t.inspect }.join}" + end + tempfile_retained = live2[1] - live1[1] + if !tempfile_retained.empty? + puts "Leaked tempfiles: #{inst.class}\##{inst.__name__}:#{tempfile_retained.map {|t| ' ' + t.inspect }.join}" + tempfile_retained.each {|t| t.unlink } + end + end + ## # Record the result of a single test. Makes it very easy to gather # information. Eg: |