]> git.lizzy.rs Git - rust.git/commitdiff
Add run-pass-valgrind tests
authorNick Cameron <ncameron@mozilla.com>
Tue, 7 Oct 2014 07:00:26 +0000 (20:00 +1300)
committerNick Cameron <ncameron@mozilla.com>
Thu, 23 Oct 2014 00:52:34 +0000 (13:52 +1300)
Closes #16914

configure
mk/main.mk
mk/tests.mk
src/compiletest/common.rs
src/compiletest/compiletest.rs
src/compiletest/runtest.rs
src/libgetopts/lib.rs

index aced2fd64dbb28106be16ad47bff25b64e1e47e6..8604dfeaffc30111764e50aa836d45323e61612b 100755 (executable)
--- a/configure
+++ b/configure
@@ -906,6 +906,7 @@ do
     done
 
     make_dir $h/test/run-pass
+    make_dir $h/test/run-pass-valgrind
     make_dir $h/test/run-pass-fulldeps
     make_dir $h/test/run-fail
     make_dir $h/test/compile-fail
index c43d17426b259ec6f8b30b48495ec6d33bc38987..93fdda869c96418a6b8d01337f1cc662e75b47ce 100644 (file)
@@ -174,6 +174,8 @@ else
   CFG_VALGRIND_COMPILE :=
 endif
 
+VALGRIND_PATH :=$(CFG_VALGRIND)
+
 ifdef CFG_ENABLE_VALGRIND
   $(info cfg: enabling valgrind (CFG_ENABLE_VALGRIND))
 else
@@ -182,6 +184,7 @@ endif
 ifdef CFG_BAD_VALGRIND
   $(info cfg: disabling valgrind due to its unreliability on this platform)
   CFG_VALGRIND :=
+  VALGRIND_PATH :=
 endif
 
 
index 57f37b3450c3f893f40e097c1da990c13e31b914..b9e6ab8909b772fb1451bd39af94e384287aefd3 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright 2012 The Rust Project Developers. See the COPYRIGHT
+# Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
 # file at the top-level directory of this distribution and at
 # http://rust-lang.org/COPYRIGHT.
 #
@@ -184,12 +184,12 @@ check-notidy: cleantmptestlogs cleantestlibs all check-stage2
 # A slightly smaller set of tests for smoke testing.
 check-lite: cleantestlibs cleantmptestlogs \
        $(foreach crate,$(TEST_TARGET_CRATES),check-stage2-$(crate)) \
-       check-stage2-rpass \
+       check-stage2-rpass check-stage2-rpass-valgrind \
        check-stage2-rfail check-stage2-cfail check-stage2-rmake
        $(Q)$(CFG_PYTHON) $(S)src/etc/check-summary.py tmp/*.log
 
 # Only check the 'reference' tests: rpass/cfail/rfail/rmake.
-check-ref: cleantestlibs cleantmptestlogs check-stage2-rpass \
+check-ref: cleantestlibs cleantmptestlogs check-stage2-rpass check-stage2-rpass-valgrind \
        check-stage2-rfail check-stage2-cfail check-stage2-rmake
        $(Q)$(CFG_PYTHON) $(S)src/etc/check-summary.py tmp/*.log
 
@@ -491,6 +491,8 @@ $(foreach host,$(CFG_HOST), \
 
 RPASS_RC := $(wildcard $(S)src/test/run-pass/*.rc)
 RPASS_RS := $(wildcard $(S)src/test/run-pass/*.rs)
+RPASS_VALGRIND_RC := $(wildcard $(S)src/test/run-pass-valgrind/*.rc)
+RPASS_VALGRIND_RS := $(wildcard $(S)src/test/run-pass-valgrind/*.rs)
 RPASS_FULL_RC := $(wildcard $(S)src/test/run-pass-fulldeps/*.rc)
 RPASS_FULL_RS := $(wildcard $(S)src/test/run-pass-fulldeps/*.rs)
 CFAIL_FULL_RC := $(wildcard $(S)src/test/compile-fail-fulldeps/*.rc)
@@ -511,6 +513,7 @@ CODEGEN_CC := $(wildcard $(S)src/test/codegen/*.cc)
 PERF_RS := $(wildcard $(S)src/test/bench/*.rs)
 
 RPASS_TESTS := $(RPASS_RC) $(RPASS_RS)
+RPASS_VALGRIND_TESTS := $(RPASS_VALGRIND_RC) $(RPASS_VALGRIND_RS)
 RPASS_FULL_TESTS := $(RPASS_FULL_RC) $(RPASS_FULL_RS)
 CFAIL_FULL_TESTS := $(CFAIL_FULL_RC) $(CFAIL_FULL_RS)
 RFAIL_TESTS := $(RFAIL_RC) $(RFAIL_RS)
@@ -527,6 +530,14 @@ CTEST_BUILD_BASE_rpass = run-pass
 CTEST_MODE_rpass = run-pass
 CTEST_RUNTOOL_rpass = $(CTEST_RUNTOOL)
 
+CTEST_SRC_BASE_rpass-valgrind = run-pass-valgrind
+CTEST_BUILD_BASE_rpass-valgrind = run-pass-valgrind
+CTEST_MODE_rpass-valgrind = run-pass-valgrind
+CTEST_RUNTOOL_rpass-valgrind = $(CTEST_RUNTOOL)
+ifdef VALGRIND_PATH
+CTEST_TESTARGS += --valgrind-path "$(VALGRIND_PATH)"
+endif
+
 CTEST_SRC_BASE_rpass-full = run-pass-fulldeps
 CTEST_BUILD_BASE_rpass-full = run-pass-fulldeps
 CTEST_MODE_rpass-full = run-pass
@@ -622,7 +633,7 @@ TEST_SREQ$(1)_T_$(2)_H_$(3) = \
 # remove directive, if present, from CFG_RUSTC_FLAGS (issue #7898).
 CTEST_RUSTC_FLAGS := $$(subst --cfg ndebug,,$$(CFG_RUSTC_FLAGS))
 
-# The tests can not be optimized while the rest of the compiler is optimized, so
+# The tests cannot be optimized while the rest of the compiler is optimized, so
 # filter out the optimization (if any) from rustc and then figure out if we need
 # to be optimized
 CTEST_RUSTC_FLAGS := $$(subst -O,,$$(CTEST_RUSTC_FLAGS))
@@ -634,6 +645,7 @@ endif
 # slow things down.
 CTEST_RUSTC_FLAGS += -C codegen-units=1
 
+
 CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3) := \
                --compile-lib-path $$(HLIB$(1)_H_$(3)) \
         --run-lib-path $$(TLIB$(1)_T_$(2)_H_$(3)) \
@@ -655,6 +667,7 @@ CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3) := \
         $$(CTEST_TESTARGS)
 
 CTEST_DEPS_rpass_$(1)-T-$(2)-H-$(3) = $$(RPASS_TESTS)
+CTEST_DEPS_rpass-valgrind_$(1)-T-$(2)-H-$(3) = $$(RPASS_VALGRIND_TESTS)
 CTEST_DEPS_rpass-full_$(1)-T-$(2)-H-$(3) = $$(RPASS_FULL_TESTS) $$(CSREQ$(1)_T_$(3)_H_$(3)) $$(SREQ$(1)_T_$(2)_H_$(3))
 CTEST_DEPS_cfail-full_$(1)-T-$(2)-H-$(3) = $$(CFAIL_FULL_TESTS) $$(CSREQ$(1)_T_$(3)_H_$(3)) $$(SREQ$(1)_T_$(2)_H_$(3))
 CTEST_DEPS_rfail_$(1)-T-$(2)-H-$(3) = $$(RFAIL_TESTS)
@@ -726,7 +739,7 @@ endif
 
 endef
 
-CTEST_NAMES = rpass rpass-full cfail-full rfail cfail bench perf debuginfo-gdb debuginfo-lldb codegen
+CTEST_NAMES = rpass rpass-valgrind rpass-full cfail-full rfail cfail bench perf debuginfo-gdb debuginfo-lldb codegen
 
 $(foreach host,$(CFG_HOST), \
  $(eval $(foreach target,$(CFG_TARGET), \
@@ -895,6 +908,7 @@ TEST_GROUPS = \
        $(foreach crate,$(TEST_CRATES),$(crate)) \
        $(foreach crate,$(TEST_DOC_CRATES),doc-crate-$(crate)) \
        rpass \
+    rpass-valgrind \
        rpass-full \
        cfail-full \
        rfail \
index 4c602b8e1a3a5ac2e49391c338d551c56cc8be2a..d8a0afc38e783841b6c3583eaf88ff14167655d6 100644 (file)
@@ -17,6 +17,7 @@ pub enum Mode {
     CompileFail,
     RunFail,
     RunPass,
+    RunPassValgrind,
     Pretty,
     DebugInfoGdb,
     DebugInfoLldb,
@@ -29,6 +30,7 @@ fn from_str(s: &str) -> Option<Mode> {
           "compile-fail" => Some(CompileFail),
           "run-fail" => Some(RunFail),
           "run-pass" => Some(RunPass),
+          "run-pass-valgrind" => Some(RunPassValgrind),
           "pretty" => Some(Pretty),
           "debuginfo-lldb" => Some(DebugInfoLldb),
           "debuginfo-gdb" => Some(DebugInfoGdb),
@@ -44,6 +46,7 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
             CompileFail => "compile-fail",
             RunFail => "run-fail",
             RunPass => "run-pass",
+            RunPassValgrind => "run-pass-valgrind",
             Pretty => "pretty",
             DebugInfoGdb => "debuginfo-gdb",
             DebugInfoLldb => "debuginfo-lldb",
@@ -70,6 +73,9 @@ pub struct Config {
     // The llvm binaries path
     pub llvm_bin_path: Option<Path>,
 
+    // The valgrind path
+    pub valgrind_path: Option<String>,
+
     // The directory containing the tests to run
     pub src_base: Path,
 
index 28aaca1776ba11f82c13bfbd1920c42c30547a51..3ac25937b38135832b54de58586a23cbfa57d08f 100644 (file)
@@ -50,13 +50,14 @@ pub fn parse_config(args: Vec<String> ) -> Config {
           reqopt("", "run-lib-path", "path to target shared libraries", "PATH"),
           reqopt("", "rustc-path", "path to rustc to use for compiling", "PATH"),
           optopt("", "clang-path", "path to  executable for codegen tests", "PATH"),
+          optopt("", "valgrind-path", "path to valgrind executable for valgrind tests", "PROGRAM"),
           optopt("", "llvm-bin-path", "path to directory holding llvm binaries", "DIR"),
           reqopt("", "src-base", "directory to scan for test files", "PATH"),
           reqopt("", "build-base", "directory to deposit test outputs", "PATH"),
           reqopt("", "aux-base", "directory to find auxiliary test files", "PATH"),
           reqopt("", "stage-id", "the target-stage identifier", "stageN-TARGET"),
           reqopt("", "mode", "which sort of compile tests to run",
-                 "(compile-fail|run-fail|run-pass|pretty|debug-info)"),
+                 "(compile-fail|run-fail|run-pass|run-pass-valgrind|pretty|debug-info)"),
           optflag("", "ignored", "run tests marked as ignored"),
           optopt("", "runtool", "supervisor program to run tests under \
                                  (eg. emulator, valgrind)", "PROGRAM"),
@@ -125,6 +126,7 @@ fn opt_path(m: &getopts::Matches, nm: &str) -> Path {
         run_lib_path: matches.opt_str("run-lib-path").unwrap(),
         rustc_path: opt_path(matches, "rustc-path"),
         clang_path: matches.opt_str("clang-path").map(|s| Path::new(s)),
+        valgrind_path: matches.opt_str("valgrind-path"),
         llvm_bin_path: matches.opt_str("llvm-bin-path").map(|s| Path::new(s)),
         src_base: opt_path(matches, "src-base"),
         build_base: opt_path(matches, "build-base"),
index c703953ff70bcf520464919df874e67e4895e9c8..6b542fed68d66faa85c3426b840e5c3b0fee8e37 100644 (file)
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 use common::Config;
-use common::{CompileFail, Pretty, RunFail, RunPass, DebugInfoGdb};
+use common::{CompileFail, Pretty, RunFail, RunPass, RunPassValgrind, DebugInfoGdb};
 use common::{Codegen, DebugInfoLldb};
 use errors;
 use header::TestProps;
@@ -35,7 +35,6 @@
 use test::MetricMap;
 
 pub fn run(config: Config, testfile: String) {
-
     match config.target.as_slice() {
 
         "arm-linux-androideabi" => {
@@ -64,6 +63,7 @@ pub fn run_metrics(config: Config, testfile: String, mm: &mut MetricMap) {
       CompileFail => run_cfail_test(&config, &props, &testfile),
       RunFail => run_rfail_test(&config, &props, &testfile),
       RunPass => run_rpass_test(&config, &props, &testfile),
+      RunPassValgrind => run_valgrind_test(&config, &props, &testfile),
       Pretty => run_pretty_test(&config, &props, &testfile),
       DebugInfoGdb => run_debuginfo_gdb_test(&config, &props, &testfile),
       DebugInfoLldb => run_debuginfo_lldb_test(&config, &props, &testfile),
@@ -164,6 +164,27 @@ fn run_rpass_test(config: &Config, props: &TestProps, testfile: &Path) {
     }
 }
 
+fn run_valgrind_test(config: &Config, props: &TestProps, testfile: &Path) {
+    if config.valgrind_path.is_none() {
+        return run_rpass_test(config, props, testfile);
+    }
+
+    let mut proc_res = compile_test(config, props, testfile);
+
+    if !proc_res.status.success() {
+        fatal_proc_rec("compilation failed!", &proc_res);
+    }
+
+    println!("running valgrind");
+    let mut new_config = config.clone();
+    new_config.runtool = new_config.valgrind_path.clone();
+    proc_res = exec_compiled_test(&new_config, props, testfile);
+
+    if !proc_res.status.success() {
+        fatal_proc_rec("test run failed!", &proc_res);
+    }
+}
+
 fn run_pretty_test(config: &Config, props: &TestProps, testfile: &Path) {
     if props.pp_exact.is_some() {
         logv(config, "testing for exact pretty-printing".to_string());
index 37b3458b555123a4fbf33226cd26c0b9c84440ec..aa625de93981b4630e5df144c7ecd50da74fa3b1 100644 (file)
@@ -804,7 +804,7 @@ pub fn short_usage(program_name: &str, opts: &[OptGroup]) -> String {
 /// whitespace removed, and are only cut at whitespace boundaries.
 ///
 /// Note: Function was moved here from `std::str` because this module is the only place that
-/// uses it, and because it was to specific for a general string function.
+/// uses it, and because it was too specific for a general string function.
 ///
 /// #Failure:
 ///