[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]