diff options
| author | Brian Leibig <brian.leibig@gmail.com> | 2013-02-09 13:09:19 -0500 |
|---|---|---|
| committer | Brian Leibig <brian.leibig@gmail.com> | 2013-02-09 13:09:19 -0500 |
| commit | 6bfbdadd3bdb811c16f4aecd1f123c1a1eb0ee2e (patch) | |
| tree | b856d591ec04d8983981f890664b5432ee1a0902 /src/compiletest | |
| parent | 0c2b4edff5009ff4d2330723d9acbc85af4b12ab (diff) | |
| download | rust-6bfbdadd3bdb811c16f4aecd1f123c1a1eb0ee2e.tar.gz rust-6bfbdadd3bdb811c16f4aecd1f123c1a1eb0ee2e.zip | |
Add debug info tests
Diffstat (limited to 'src/compiletest')
| -rw-r--r-- | src/compiletest/common.rs | 5 | ||||
| -rw-r--r-- | src/compiletest/compiletest.rc | 5 | ||||
| -rw-r--r-- | src/compiletest/header.rs | 34 | ||||
| -rw-r--r-- | src/compiletest/runtest.rs | 57 |
4 files changed, 91 insertions, 10 deletions
diff --git a/src/compiletest/common.rs b/src/compiletest/common.rs index 9d4becd63d3..679f9ab93bf 100644 --- a/src/compiletest/common.rs +++ b/src/compiletest/common.rs @@ -1,5 +1,5 @@ -// Copyright 2012 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at +// Copyright 2012-2013 The Rust Project Developers. See the +// COPYRIGHT file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or @@ -18,6 +18,7 @@ pub enum mode { mode_run_fail, mode_run_pass, mode_pretty, + mode_debug_info, } pub type config = { diff --git a/src/compiletest/compiletest.rc b/src/compiletest/compiletest.rc index b63ac5e75a2..6d3bfde0372 100644 --- a/src/compiletest/compiletest.rc +++ b/src/compiletest/compiletest.rc @@ -41,6 +41,7 @@ use common::mode_run_pass; use common::mode_run_fail; use common::mode_compile_fail; use common::mode_pretty; +use common::mode_debug_info; use common::mode; use util::logv; @@ -131,6 +132,7 @@ pub fn str_mode(s: ~str) -> mode { ~"run-fail" => mode_run_fail, ~"run-pass" => mode_run_pass, ~"pretty" => mode_pretty, + ~"debug-info" => mode_debug_info, _ => die!(~"invalid mode") } } @@ -140,7 +142,8 @@ pub fn mode_str(mode: mode) -> ~str { mode_compile_fail => ~"compile-fail", mode_run_fail => ~"run-fail", mode_run_pass => ~"run-pass", - mode_pretty => ~"pretty" + mode_pretty => ~"pretty", + mode_debug_info => ~"debug-info", } } diff --git a/src/compiletest/header.rs b/src/compiletest/header.rs index 0b9d67426ae..5c33c66209a 100644 --- a/src/compiletest/header.rs +++ b/src/compiletest/header.rs @@ -1,5 +1,5 @@ -// Copyright 2012 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at +// Copyright 2012-2013 The Rust Project Developers. See the +// COPYRIGHT file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or @@ -28,7 +28,11 @@ pub struct TestProps { // Modules from aux directory that should be compiled aux_builds: ~[~str], // Environment settings to use during execution - exec_env: ~[(~str,~str)] + exec_env: ~[(~str,~str)], + // Commands to be given to the debugger, when testing debug info + debugger_cmds: ~[~str], + // Lines to check if they appear in the expected debugger output + check_lines: ~[~str], } // Load any test directives embedded in the file @@ -38,6 +42,8 @@ pub fn load_props(testfile: &Path) -> TestProps { let mut exec_env = ~[]; let mut compile_flags = None; let mut pp_exact = None; + let mut debugger_cmds = ~[]; + let mut check_lines = ~[]; for iter_header(testfile) |ln| { match parse_error_pattern(ln) { Some(ep) => error_patterns.push(ep), @@ -59,13 +65,25 @@ pub fn load_props(testfile: &Path) -> TestProps { do parse_exec_env(ln).iter |ee| { exec_env.push(*ee); } + + match parse_debugger_cmd(ln) { + Some(dc) => debugger_cmds.push(dc), + None => () + }; + + match parse_check_line(ln) { + Some(cl) => check_lines.push(cl), + None => () + }; }; return TestProps { error_patterns: error_patterns, compile_flags: compile_flags, pp_exact: pp_exact, aux_builds: aux_builds, - exec_env: exec_env + exec_env: exec_env, + debugger_cmds: debugger_cmds, + check_lines: check_lines }; } @@ -112,6 +130,14 @@ fn parse_compile_flags(line: ~str) -> Option<~str> { parse_name_value_directive(line, ~"compile-flags") } +fn parse_debugger_cmd(line: ~str) -> Option<~str> { + parse_name_value_directive(line, ~"debugger") +} + +fn parse_check_line(line: ~str) -> Option<~str> { + parse_name_value_directive(line, ~"check") +} + fn parse_exec_env(line: ~str) -> Option<(~str, ~str)> { do parse_name_value_directive(line, ~"exec-env").map |nv| { // nv is either FOO or FOO=BAR diff --git a/src/compiletest/runtest.rs b/src/compiletest/runtest.rs index a71b8a360a2..0f8c8761c42 100644 --- a/src/compiletest/runtest.rs +++ b/src/compiletest/runtest.rs @@ -1,5 +1,5 @@ -// Copyright 2012 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at +// Copyright 2012-2013 The Rust Project Developers. See the +// COPYRIGHT file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or @@ -39,11 +39,13 @@ pub fn run(config: config, testfile: ~str) { let testfile = Path(testfile); debug!("running %s", testfile.to_str()); let props = load_props(&testfile); + debug!("loaded props"); match config.mode { mode_compile_fail => run_cfail_test(config, props, &testfile), mode_run_fail => run_rfail_test(config, props, &testfile), mode_run_pass => run_rpass_test(config, props, &testfile), - mode_pretty => run_pretty_test(config, props, &testfile) + mode_pretty => run_pretty_test(config, props, &testfile), + mode_debug_info => run_debuginfo_test(config, props, &testfile) } } @@ -224,6 +226,55 @@ actual:\n\ } } +fn run_debuginfo_test(config: config, props: TestProps, testfile: &Path) { + // compile test file (it shoud have 'compile-flags:-g' in the header) + let mut ProcRes = compile_test(config, props, testfile); + if ProcRes.status != 0 { + fatal_ProcRes(~"compilation failed!", ProcRes); + } + + // write debugger script + let script_str = str::append(str::connect(props.debugger_cmds, "\n"), + ~"\nquit\n"); + debug!("script_str = %s", script_str); + dump_output_file(config, testfile, script_str, ~"debugger.script"); + + // run debugger script with gdb + #[cfg(windows)] + fn debugger() -> ~str { ~"gdb.exe" } + #[cfg(unix)] + fn debugger() -> ~str { ~"gdb" } + let debugger_script = make_out_name(config, testfile, ~"debugger.script"); + let debugger_opts = ~[~"-quiet", ~"-batch", ~"-nx", + ~"-command=" + debugger_script.to_str(), + make_exe_name(config, testfile).to_str()]; + let ProcArgs = ProcArgs {prog: debugger(), args: debugger_opts}; + ProcRes = compose_and_run(config, testfile, ProcArgs, ~[], ~"", None); + if ProcRes.status != 0 { + fatal(~"gdb failed to execute"); + } + + let num_check_lines = vec::len(props.check_lines); + if num_check_lines > 0 { + // check if each line in props.check_lines appears in the + // output (in order) + let mut i = 0u; + for str::lines(ProcRes.stdout).each |line| { + if props.check_lines[i].trim() == line.trim() { + i += 1u; + } + if i == num_check_lines { + // all lines checked + break; + } + } + if i != num_check_lines { + fatal(fmt!("line not found in debugger output: %s", + props.check_lines[i])); + } + } +} + fn check_error_patterns(props: TestProps, testfile: &Path, ProcRes: ProcRes) { |
