Regression on failed runs outputting huge stack trace for rake itself.
zenspider opened this issue · comments
using:
Rake::TestTask.new "testtask"
on ruby 2 with rake 0.9.x:
10016 % rake testtask
Run options: --seed 56356
# Running:
F
Finished in 0.000913s, 1095.2903 runs/s, 1095.2903 assertions/s.
1) Failure:
woot#test_0001_should die [/Users/ryan/Work/p4/zss/src/minitest/dev/test/test_fail.rb:5]:
no
1 runs, 1 assertions, 1 failures, 0 errors, 0 skips
rake aborted!
Command failed with status (1): [ruby -I"lib" -I"/Library/Ruby/Gems/1.8/gems/rake-0.9.6/lib" "/Library/Ruby/Gems/1.8/gems/rake-0.9.6/lib/rake/rake_test_loader.rb" "test/test*.rb" ]
Tasks: TOP => testtask
(See full trace by running task with --trace)
on ruby 2.0 with rake 10.0.4:
10017 % GEM_PATH=xxx rake20 testtask
Run options: --seed 14367
# Running:
F
Finished in 0.000754s, 1326.2599 runs/s, 1326.2599 assertions/s.
1) Failure:
woot#test_0001_should die [/Users/ryan/Work/p4/zss/src/minitest/dev/test/test_fail.rb:5]:
no
1 runs, 1 assertions, 1 failures, 0 errors, 0 skips
rake aborted!
Command failed with status (1): [ruby -I"lib" -I"/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib" "/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/rake_test_loader.rb" "test/test*.rb" ]
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/testtask.rb:104:in `block (3 levels) in define'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/file_utils.rb:45:in `call'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/file_utils.rb:45:in `sh'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/file_utils_ext.rb:37:in `sh'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/file_utils.rb:82:in `ruby'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/file_utils_ext.rb:37:in `ruby'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/testtask.rb:100:in `block (2 levels) in define'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/file_utils_ext.rb:58:in `verbose'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/testtask.rb:98:in `block in define'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/task.rb:246:in `call'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/task.rb:246:in `block in execute'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/task.rb:241:in `each'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/task.rb:241:in `execute'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/task.rb:184:in `block in invoke_with_call_chain'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/task.rb:177:in `invoke_with_call_chain'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/task.rb:170:in `invoke'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/application.rb:143:in `invoke_task'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/application.rb:101:in `block (2 levels) in top_level'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/application.rb:101:in `each'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/application.rb:101:in `block in top_level'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/application.rb:110:in `run_with_threads'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/application.rb:95:in `top_level'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/application.rb:73:in `block in run'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/application.rb:160:in `standard_exception_handling'
/Users/ryan/Work/p4/zss/src/minitest/dev/xxx/gems/rake-10.0.4/lib/rake/application.rb:70:in `run'
Tasks: TOP => testtask
(See full trace by running task with --trace)
Can I see the code for the failing test (having difficulty replicating your exact results).
It's just a failing test...
rake demo
to show the problem. I'm using ruby 2.0:
# -*- ruby -*-
require "rake/testtask"
Rake::TestTask.new "testtask"
task :default => :demo
task :demo => :setup do
puts "good:"
system "ruby -S gem list rake"
output = `ruby -S rake testtask 2>&1`
puts output
puts "Lines = #{output.lines.size}"
puts "bad:"
ENV["GEM_PATH"] = "tmp"
system "ruby -S gem list rake"
output = `ruby -S rake testtask 2>&1`
puts output
puts "Lines = #{output.lines.size}"
end
task :setup do
unless File.directory? "tmp" then
ruby "-S gem i -i tmp rake --no-rdoc --no-ri"
end
unless File.file? "test/test_bug.rb" then
mkdir_p "test"
File.open "test/test_bug.rb", "w" do |f|
f.puts "exit 1"
end
end
end
task :clean do
rm_rf Dir["test", "tmp", "*~"]
end
output:
10067 % rake demo
rake demo
good:
*** LOCAL GEMS ***
rake (0.9.6)
rake aborted!
Command failed with status (1): [ruby -I"lib" -I"/Users/ryan/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0" "/Users/ryan/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/rake/rake_test_loader.rb" "test/test*.rb" ]
Tasks: TOP => testtask
(See full trace by running task with --trace)
Lines = 5
bad:
*** LOCAL GEMS ***
rake (10.0.4, 0.9.6)
rake aborted!
Command failed with status (1): [ruby -I"lib" -I"/Users/ryan/regression/tmp/gems/rake-10.0.4/lib" "/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/rake_test_loader.rb" "test/test*.rb" ]
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/testtask.rb:104:in `block (3 levels) in define'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/file_utils.rb:45:in `call'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/file_utils.rb:45:in `sh'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/file_utils_ext.rb:37:in `sh'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/file_utils.rb:82:in `ruby'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/file_utils_ext.rb:37:in `ruby'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/testtask.rb:100:in `block (2 levels) in define'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/file_utils_ext.rb:58:in `verbose'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/testtask.rb:98:in `block in define'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/task.rb:246:in `call'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/task.rb:246:in `block in execute'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/task.rb:241:in `each'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/task.rb:241:in `execute'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/task.rb:184:in `block in invoke_with_call_chain'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/task.rb:177:in `invoke_with_call_chain'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/task.rb:170:in `invoke'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/application.rb:143:in `invoke_task'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/application.rb:101:in `block (2 levels) in top_level'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/application.rb:101:in `each'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/application.rb:101:in `block in top_level'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/application.rb:110:in `run_with_threads'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/application.rb:95:in `top_level'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/application.rb:73:in `block in run'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/application.rb:160:in `standard_exception_handling'
/Users/ryan/regression/tmp/gems/rake-10.0.4/lib/rake/application.rb:70:in `run'
Tasks: TOP => testtask
(See full trace by running task with --trace)
Lines = 29
Looks like the problem is "fixed" by changing display_error_message
from:
trace Backtrace.collapse(ex.backtrace).join("\n")
to:
trace Backtrace.collapse(ex.backtrace).first
and the real problem is in Backtrace.collapse
.
Yes. Backtrace.collapse needed some cleanup. See #193 for details.
In your particular case, the patch for switching 's to /'s runs after the Regexp quote and screws up the patterns.
There is a 10.1.0.beta.3 on Rubygems.org with that fix, see if that works for you.
Looks good to me as confirmed by adding --pre
to the setup task. Thanks.
Great.
Thanks @jimweirich. I ran into this problem today on a new project using ruby 2, minitest and rake. 10.1.0.beta.3 fixed it for me (with the exception of the ruby_noexec_wrapper that appear to be coming from RVM - as referenced in #193).
@jimweirich I ran into this problem and 10.1.0.beta.3 shortens but does not entirely remove the stack trace.
I'm new to ruby and rake so I hope this is enough information for you to diagnose. Thanks!
My Rakefile
require "bundler/gem_tasks"
require 'rake/testtask'
Rake::TestTask.new do |t|
t.libs << "test"
# OK to use default patter 'test/test*.rb' for now
trace = false
end
desc "Run tests"
task :default => :test
ruby info
$ which ruby
/home/jkanywhere/.rvm/rubies/ruby-1.9.3-p392/bin/ruby
$ ruby --version
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-linux]
rake version 10.0.4
produced long stack trace
$ rake --version
rake, version 10.0.4
$ rake test
Run options:
# Running tests:
F.
Finished tests in 0.000392s, 5099.9072 tests/s, 5099.9072 assertions/s.
1) Failure:
test_that_fails(CredsTest) [/home/jkanywhere/Documents/projects/lolruby/spice-creds-aws/test/test_test.rb:9]:
Failed assertion, no message given.
2 tests, 2 assertions, 1 failures, 0 errors, 0 skips
rake aborted!
Command failed with status (1): [ruby -I"lib:test" -I"/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib" "/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/rake_test_loader.rb" "test/test*.rb" ]
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/testtask.rb:104:in `block (3 levels) in define'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/file_utils.rb:45:in `call'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/file_utils.rb:45:in `sh'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/file_utils_ext.rb:37:in `sh'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/file_utils.rb:82:in `ruby'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/file_utils_ext.rb:37:in `ruby'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/testtask.rb:100:in `block (2 levels) in define'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/file_utils_ext.rb:58:in `verbose'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/testtask.rb:98:in `block in define'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/task.rb:246:in `call'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/task.rb:246:in `block in execute'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/task.rb:241:in `each'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/task.rb:241:in `execute'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/task.rb:184:in `block in invoke_with_call_chain'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/task.rb:177:in `invoke_with_call_chain'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/task.rb:170:in `invoke'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:143:in `invoke_task'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:101:in `block (2 levels) in top_level'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:101:in `each'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:101:in `block in top_level'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:110:in `run_with_threads'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:95:in `top_level'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:73:in `block in run'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:160:in `standard_exception_handling'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:70:in `run'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392/bin/ruby_noexec_wrapper:14:in `eval'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392/bin/ruby_noexec_wrapper:14:in `<main>'
Tasks: TOP => test
(See full trace by running task with --trace)
rake version 10.1.0.beta.3
produced short stack trace
$ rake --version
rake, version 10.1.0.beta.3
$ rake test
Run options:
# Running tests:
F.
Finished tests in 0.000390s, 5134.6564 tests/s, 5134.6564 assertions/s.
1) Failure:
test_that_fails(CredsTest) [/home/jkanywhere/Documents/projects/lolruby/spice-creds-aws/test/test_test.rb:9]:
Failed assertion, no message given.
2 tests, 2 assertions, 1 failures, 0 errors, 0 skips
rake aborted!
Command failed with status (1): [ruby -I"lib:test" -I"/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392/gems/rake-10.1.0.beta.3/lib" "/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392/gems/rake-10.1.0.beta.3/lib/rake/rake_test_loader.rb" "test/test*.rb" ]
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392/bin/ruby_noexec_wrapper:14:in `eval'
/home/jkanywhere/.rvm/gems/ruby-1.9.3-p392/bin/ruby_noexec_wrapper:14:in `<main>'
Tasks: TOP => test
(See full trace by running task with --trace)
I think the ruby_noexec_wrapper stack entries are coming from RVM. Rake is cleaning up its own stack, I'm not sure that it should be messing with stack entries from arbitrary software.
FWIW, 10.0.4 has (on Linux with MRI 1.9.3p194) similar issues as this gist reported... (which is also a bit similar to this issue in question).
Switching to rake-10.1.0.beta.3 worked great to fix that regression also.
FYI, had the same issue here. Running the same test suite without rvm seemed to do the trick.
Same here as with @jkanywhere
Fixed in 10.1.0.