]> git.lizzy.rs Git - rust.git/commitdiff
extra: add explicit ratchet-noise-percent option to benchmark ratchet, plus a few...
authorGraydon Hoare <graydon@mozilla.com>
Thu, 11 Jul 2013 22:16:11 +0000 (15:16 -0700)
committerGraydon Hoare <graydon@mozilla.com>
Thu, 11 Jul 2013 22:16:11 +0000 (15:16 -0700)
src/compiletest/compiletest.rs
src/libextra/json.rs
src/libextra/test.rs

index 5d3f81fd884566eceb6472fa9db69b1374086058..a411e714247ed4f9b547d3e40a09a986186b0d0c 100644 (file)
@@ -79,7 +79,7 @@ pub fn parse_config(args: ~[~str]) -> config {
     let args_ = args.tail();
     if args[1] == ~"-h" || args[1] == ~"--help" {
         let message = fmt!("Usage: %s [OPTIONS] [TESTNAME...]", argv0);
-        io::println(getopts::groups::usage(message, groups));
+        println(getopts::groups::usage(message, groups));
         fail!()
     }
 
@@ -91,7 +91,7 @@ pub fn parse_config(args: ~[~str]) -> config {
 
     if getopts::opt_present(matches, "h") || getopts::opt_present(matches, "help") {
         let message = fmt!("Usage: %s [OPTIONS]  [TESTNAME...]", argv0);
-        io::println(getopts::groups::usage(message, groups));
+        println(getopts::groups::usage(message, groups));
         fail!()
     }
 
@@ -216,8 +216,9 @@ pub fn test_opts(config: &config) -> test::TestOpts {
         logfile: copy config.logfile,
         run_tests: true,
         run_benchmarks: false,
-        save_results: None,
-        compare_results: None
+        ratchet_metrics: None,
+        ratchet_noise_percent: None,
+        save_metrics: None,
     }
 }
 
index 7a3d3bf0cf3558c10204c9c9fc5c46f8b5540bfc..2f17e4a741761806d84d37d824b3e7c810ef9390 100644 (file)
@@ -1331,7 +1331,7 @@ impl<A:ToJson> ToJson for ~[A] {
     fn to_json(&self) -> Json { List(self.map(|elt| elt.to_json())) }
 }
 
-impl<A:ToJson + Copy> ToJson for HashMap<~str, A> {
+impl<A:ToJson> ToJson for HashMap<~str, A> {
     fn to_json(&self) -> Json {
         let mut d = HashMap::new();
         for self.iter().advance |(key, value)| {
@@ -1341,7 +1341,7 @@ fn to_json(&self) -> Json {
     }
 }
 
-impl<A:ToJson + Copy> ToJson for TreeMap<~str, A> {
+impl<A:ToJson> ToJson for TreeMap<~str, A> {
     fn to_json(&self) -> Json {
         let mut d = HashMap::new();
         for self.iter().advance |(key, value)| {
index a284c8071696fef7b92bb6838bb257d5a8295ceb..96ca429676850ff47556b18cbaad0a8a8d1b3459 100644 (file)
 use std::comm::{stream, SharedChan};
 use std::either;
 use std::io;
-use std::option;
 use std::result;
 use std::task;
 use std::to_str::ToStr;
 use std::u64;
+use std::f64;
 use std::hashmap::HashMap;
 use std::os;
 
@@ -149,6 +149,7 @@ pub struct TestOpts {
     run_tests: bool,
     run_benchmarks: bool,
     ratchet_metrics: Option<Path>,
+    ratchet_noise_percent: Option<f64>,
     save_metrics: Option<Path>,
     logfile: Option<Path>
 }
@@ -163,6 +164,7 @@ pub fn parse_opts(args: &[~str]) -> OptRes {
                  getopts::optflag("bench"),
                  getopts::optopt("save-metrics"),
                  getopts::optopt("ratchet-metrics"),
+                 getopts::optopt("ratchet-noise-percent"),
                  getopts::optopt("logfile")];
     let matches =
         match getopts::getopts(args_, opts) {
@@ -172,8 +174,8 @@ pub fn parse_opts(args: &[~str]) -> OptRes {
 
     let filter =
         if matches.free.len() > 0 {
-            option::Some(copy (matches).free[0])
-        } else { option::None };
+            Some(copy (matches).free[0])
+        } else { None };
 
     let run_ignored = getopts::opt_present(&matches, "ignored");
 
@@ -187,6 +189,10 @@ pub fn parse_opts(args: &[~str]) -> OptRes {
     let ratchet_metrics = getopts::opt_maybe_str(&matches, "ratchet-metrics");
     let ratchet_metrics = ratchet_metrics.map(|s| Path(*s));
 
+    let ratchet_noise_percent =
+        getopts::opt_maybe_str(&matches, "ratchet-noise-percent");
+    let ratchet_noise_percent = ratchet_noise_percent.map(|s| f64::from_str(*s).get());
+
     let save_metrics = getopts::opt_maybe_str(&matches, "save-metrics");
     let save_metrics = save_metrics.map(|s| Path(*s));
 
@@ -196,6 +202,7 @@ pub fn parse_opts(args: &[~str]) -> OptRes {
         run_tests: run_tests,
         run_benchmarks: run_benchmarks,
         ratchet_metrics: ratchet_metrics,
+        ratchet_noise_percent: ratchet_noise_percent,
         save_metrics: save_metrics,
         logfile: logfile
     };
@@ -405,14 +412,22 @@ pub fn write_metric_diff(&self, diff: &MetricDiff) {
         }
     }
 
-    pub fn write_run_finish(&self, ratchet_metrics: &Option<Path>) -> bool {
+    pub fn write_run_finish(&self,
+                            ratchet_metrics: &Option<Path>,
+                            ratchet_pct: Option<f64>) -> bool {
         assert!(self.passed + self.failed + self.ignored + self.benchmarked == self.total);
 
         let ratchet_success = match *ratchet_metrics {
             None => true,
             Some(ref pth) => {
                 self.out.write_str(fmt!("\nusing metrics ratchet: %s\n", pth.to_str()));
-                let (diff, ok) = self.metrics.ratchet(pth);
+                match ratchet_pct {
+                    None => (),
+                    Some(pct) =>
+                    self.out.write_str(fmt!("with noise-tolerance forced to: %f%%\n",
+                                            pct as float))
+                }
+                let (diff, ok) = self.metrics.ratchet(pth, ratchet_pct);
                 self.write_metric_diff(&diff);
                 ok
             }
@@ -488,7 +503,7 @@ fn callback(event: &TestEvent, st: &mut ConsoleTestState) {
             st.out.write_str(fmt!("\nmetrics saved to: %s", pth.to_str()));
         }
     }
-    return st.write_run_finish(&opts.ratchet_metrics);
+    return st.write_run_finish(&opts.ratchet_metrics, opts.ratchet_noise_percent);
 }
 
 #[test]
@@ -510,18 +525,19 @@ fn dummy() {}
 
         let st = @ConsoleTestState {
             out: wr,
-            log_out: option::None,
+            log_out: None,
+            term: None,
             use_color: false,
             total: 0u,
             passed: 0u,
             failed: 0u,
             ignored: 0u,
             benchmarked: 0u,
-            metrics: MetricsMap::new(),
+            metrics: MetricMap::new(),
             failures: ~[test_b, test_a]
         };
 
-        print_failures(st);
+        st.write_failures();
     };
 
     let apos = s.find_str("a").get();
@@ -624,15 +640,17 @@ pub fn filter_tests(
         filtered
     } else {
         let filter_str = match opts.filter {
-          option::Some(ref f) => copy *f,
-          option::None => ~""
+          Some(ref f) => copy *f,
+          None => ~""
         };
 
         fn filter_fn(test: TestDescAndFn, filter_str: &str) ->
             Option<TestDescAndFn> {
             if test.desc.name.to_str().contains(filter_str) {
-                return option::Some(test);
-            } else { return option::None; }
+                return Some(test);
+            } else {
+                return None;
+            }
         }
 
         filtered.consume_iter().filter_map(|x| filter_fn(x, filter_str)).collect()
@@ -757,14 +775,19 @@ pub fn save(&self, p: &Path) {
     }
 
     /// Compare against another MetricMap
-    pub fn compare_to_old(&self, old: MetricMap) -> MetricDiff {
+    pub fn compare_to_old(&self, old: MetricMap,
+                          noise_pct: Option<f64>) -> MetricDiff {
         let mut diff : MetricDiff = TreeMap::new();
         for old.iter().advance |(k, vold)| {
             let r = match self.find(k) {
                 None => MetricRemoved,
                 Some(v) => {
                     let delta = (v.value - vold.value);
-                    if delta.abs() < vold.noise.abs() {
+                    let noise = match noise_pct {
+                        None => f64::max(vold.noise.abs(), v.noise.abs()),
+                        Some(pct) => vold.value * pct / 100.0
+                    };
+                    if delta.abs() < noise {
                         LikelyNoise
                     } else {
                         let pct = delta.abs() / v.value * 100.0;
@@ -827,14 +850,14 @@ pub fn insert_metric(&mut self, name: &str, value: f64, noise: f64) {
     /// file to contain the metrics in `self` if none of the
     /// `MetricChange`s are `Regression`. Returns the diff as well
     /// as a boolean indicating whether the ratchet succeeded.
-    pub fn ratchet(&self, p: &Path) -> (MetricDiff, bool) {
+    pub fn ratchet(&self, p: &Path, pct: Option<f64>) -> (MetricDiff, bool) {
         let old = if os::path_exists(p) {
             MetricMap::load(p)
         } else {
             MetricMap::new()
         };
 
-        let diff : MetricDiff = self.compare_to_old(old);
+        let diff : MetricDiff = self.compare_to_old(old, pct);
         let ok = do diff.iter().all() |(_, v)| {
             match *v {
                 Regression(_) => false,
@@ -1092,12 +1115,14 @@ fn dummy() {}
         // unignored tests and flip the ignore flag on the rest to false
 
         let opts = TestOpts {
-            filter: option::None,
+            filter: None,
             run_ignored: true,
-            logfile: option::None,
+            logfile: None,
             run_tests: true,
             run_benchmarks: false,
-            ratchet: option::None,
+            ratchet_noise_percent: None,
+            ratchet_metrics: None,
+            save_metrics: None,
         };
 
         let tests = ~[
@@ -1128,13 +1153,14 @@ fn dummy() {}
     #[test]
     pub fn sort_tests() {
         let opts = TestOpts {
-            filter: option::None,
+            filter: None,
             run_ignored: false,
-            logfile: option::None,
+            logfile: None,
             run_tests: true,
             run_benchmarks: false,
-            ratchet_metrics: option::None,
-            save_metrics: option::None,
+            ratchet_noise_percent: None,
+            ratchet_metrics: None,
+            save_metrics: None,
         };
 
         let names =