1require File.expand_path('../helper', __FILE__) 2require 'open3' 3 4class TestRakeBacktrace < Rake::TestCase 5 6 def setup 7 super 8 9 skip 'tmpdir is suppressed in backtrace' if 10 Dir.pwd =~ Rake::Backtrace::SUPPRESS_PATTERN 11 end 12 13 # TODO: factor out similar code in test_rake_functional.rb 14 def rake(*args) 15 Open3.popen3(RUBY, "-I", @rake_lib, @rake_exec, *args) { |_, _, err, _| 16 err.read 17 } 18 end 19 20 def invoke(task_name) 21 rake task_name.to_s 22 end 23 24 def test_single_collapse 25 rakefile %q{ 26 task :foo do 27 raise "foooo!" 28 end 29 } 30 31 lines = invoke(:foo).split("\n") 32 33 assert_equal "rake aborted!", lines[0] 34 assert_equal "foooo!", lines[1] 35 assert_something_matches %r!\A#{Regexp.quote Dir.pwd}/Rakefile:3!i, lines 36 assert_something_matches %r!\ATasks:!, lines 37 end 38 39 def test_multi_collapse 40 rakefile %q{ 41 task :foo do 42 Rake.application.invoke_task(:bar) 43 end 44 task :bar do 45 raise "barrr!" 46 end 47 } 48 49 lines = invoke(:foo).split("\n") 50 51 assert_equal "rake aborted!", lines[0] 52 assert_equal "barrr!", lines[1] 53 assert_something_matches %r!\A#{Regexp.quote Dir.pwd}/Rakefile:6!i, lines 54 assert_something_matches %r!\A#{Regexp.quote Dir.pwd}/Rakefile:3!i, lines 55 assert_something_matches %r!\ATasks:!, lines 56 end 57 58 def test_suppress_option 59 rakefile %q{ 60 task :baz do 61 raise "bazzz!" 62 end 63 } 64 65 lines = rake("baz").split("\n") 66 assert_equal "rake aborted!", lines[0] 67 assert_equal "bazzz!", lines[1] 68 assert_something_matches %r!Rakefile!i, lines 69 70 lines = rake("--suppress-backtrace", ".ak.file", "baz").split("\n") 71 assert_equal "rake aborted!", lines[0] 72 assert_equal "bazzz!", lines[1] 73 refute_match %r!Rakefile!i, lines[2] 74 end 75 76 private 77 78 # Assert that the pattern matches at least one line in +lines+. 79 def assert_something_matches(pattern, lines) 80 lines.each do |ln| 81 if pattern =~ ln 82 assert_match pattern, ln 83 return 84 end 85 end 86 flunk "expected #{pattern.inspect} to match something in:\n #{lines.join("\n ")}" 87 end 88 89end 90