summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--test/-ext-/string/test_modify_expand.rb20
-rw-r--r--test/ruby/envutil.rb22
3 files changed, 31 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index 707c6e3113..57feff07e5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Feb 10 00:47:07 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/ruby/envutil.rb (assert_no_memory_leak): new assertion to
+ check memory leak by invoking child ruby process and watch its
+ memory size.
+
Thu Feb 9 23:41:44 2012 CHIKANAGA Tomoyuki <nagachika00@gmail.com>
* test/pathname/test_pathname.rb (test_binread): add assertion to
diff --git a/test/-ext-/string/test_modify_expand.rb b/test/-ext-/string/test_modify_expand.rb
index 5fee7b3580..6a18560bd4 100644
--- a/test/-ext-/string/test_modify_expand.rb
+++ b/test/-ext-/string/test_modify_expand.rb
@@ -4,26 +4,12 @@ require_relative '../../ruby/envutil'
class Test_StringModifyExpand < Test::Unit::TestCase
def test_modify_expand_memory_leak
- before = after = nil
- args = [
- "--disable=gems", "-r-test-/string/string",
- "-I"+File.expand_path("../../..", __FILE__),
- "-rruby/memory_status",
- "-e", <<-CMD
+ assert_no_memory_leak(["-r-test-/string/string"], <<-PRE, <<-CMD, "rb_str_modify_expand()")
s=Bug::String.new
- size=Memory::Status.new.size
- puts size
+ PRE
+ size = $initial_size
10.times{s.modify_expand!(size)}
s.replace("")
- puts Memory::Status.new.size
CMD
- ]
- status = EnvUtil.invoke_ruby(args, "", true) do |in_p, out_p, err_p, pid|
- before, after = out_p.readlines.map(&:to_i)
- Process.wait(pid)
- $?
- end
- assert_equal(true, status.success?)
- assert_operator after.fdiv(before), :<, 2
end
end
diff --git a/test/ruby/envutil.rb b/test/ruby/envutil.rb
index ef5f65c747..69b037b4d8 100644
--- a/test/ruby/envutil.rb
+++ b/test/ruby/envutil.rb
@@ -184,6 +184,28 @@ module Test
assert(msg === stderr, "warning message #{stderr.inspect} is expected to match #{msg.inspect}")
end
+ def assert_no_memory_leak(args, prepare, code, message=nil, limit: 1.5)
+ token = "\e[7;1m#{$$.to_s}:#{Time.now.strftime('%s.%L')}:#{rand(0x10000).to_s(16)}:\e[m"
+ token_dump = token.dump
+ token_re = Regexp.quote(token)
+ args = [
+ "--disable=gems",
+ "-r", File.expand_path("../memory_status", __FILE__),
+ *args,
+ "-v", "-",
+ ]
+ cmd = [
+ 'END {STDERR.puts '"#{token_dump}"'"FINAL=#{Memory::Status.new.size}"}',
+ prepare,
+ 'STDERR.puts('"#{token_dump}"'"START=#{$initial_size = Memory::Status.new.size}")',
+ code,
+ ].join("\n")
+ out, err, status = EnvUtil.invoke_ruby(args, cmd, true, true)
+ before = err.sub!(/^#{token_re}START=(\d+)\n/, '') && $1.to_i
+ after = err.sub!(/^#{token_re}FINAL=(\d+)\n/, '') && $1.to_i
+ assert_equal([true, ""], [status.success?, err], message)
+ assert_operator(after.fdiv(before), :<, limit, message)
+ end
end
end
end