ruby-changes:34008
From: akr <ko1@a...>
Date: Sun, 25 May 2014 09:41:25 +0900 (JST)
Subject: [ruby-changes:34008] akr:r46089 (trunk): * test/lib/minitest/unit.rb: Show leakes threads and tempfiles.
akr 2014-05-25 09:41:18 +0900 (Sun, 25 May 2014) New Revision: 46089 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=46089 Log: * test/lib/minitest/unit.rb: Show leakes threads and tempfiles. Modified files: trunk/ChangeLog trunk/test/lib/minitest/unit.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 46088) +++ ChangeLog (revision 46089) @@ -1,3 +1,7 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Sun May 25 09:40:44 2014 Tanaka Akira <akr@f...> + + * test/lib/minitest/unit.rb: Show leakes threads and tempfiles. + Sun May 25 08:54:38 2014 SHIBATA Hiroshi <shibata.hiroshi@g...> * test/openssl/test_partial_record_read.rb: Testing read_nonblock on Index: test/lib/minitest/unit.rb =================================================================== --- test/lib/minitest/unit.rb (revision 46088) +++ test/lib/minitest/unit.rb (revision 46089) @@ -927,6 +927,8 @@ module MiniTest https://github.com/ruby/ruby/blob/trunk/test/lib/minitest/unit.rb#L927 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 https://github.com/ruby/ruby/blob/trunk/test/lib/minitest/unit.rb#L938 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: -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/