Skip to content

Commit

Permalink
test: index shards at 1, not 0
Browse files Browse the repository at this point in the history
This has no tests because it's near impossible to test -- since TestFn uses
`proc`s, they can not be cloned or tested for equality. The only way to really
test this is making sure that for a given number of shards `a`, sharding from
1 to `a` yields the complete set of tests. But `filter_tests` takes its vector
by value and `proc`s cannot be compared.

[breaking-change]

Closes rust-lang#10898
  • Loading branch information
emberian committed May 19, 2014
1 parent 63287ee commit 2eeb499
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 22 deletions.
59 changes: 37 additions & 22 deletions src/libtest/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
html_favicon_url = "http://www.rust-lang.org/favicon.ico",
html_root_url = "http://static.rust-lang.org/doc/master")]

#![feature(asm, macro_rules)]
#![feature(asm, macro_rules, phase)]
#![deny(deprecated_owned_vector)]

extern crate collections;
Expand Down Expand Up @@ -83,7 +83,7 @@ pub mod stats;
// colons. This way if some test runner wants to arrange the tests
// hierarchically it may.

#[deriving(Clone)]
#[deriving(Clone, Eq, TotalEq, Hash)]
pub enum TestName {
StaticTestName(&'static str),
DynTestName(StrBuf)
Expand Down Expand Up @@ -156,6 +156,19 @@ impl TestFn {
}
}

impl fmt::Show for TestFn {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write(match *self {
StaticTestFn(..) => "StaticTestFn(..)",
StaticBenchFn(..) => "StaticBenchFn(..)",
StaticMetricFn(..) => "StaticMetricFn(..)",
DynTestFn(..) => "DynTestFn(..)",
DynMetricFn(..) => "DynMetricFn(..)",
DynBenchFn(..) => "DynBenchFn(..)"
}.as_bytes())
}
}

/// Manager of the benchmarking runs.
///
/// This is feed into functions marked with `#[bench]` to allow for
Expand All @@ -170,13 +183,14 @@ pub struct Bencher {

// The definition of a single test. A test runner will run a list of
// these.
#[deriving(Clone)]
#[deriving(Clone, Show, Eq, TotalEq, Hash)]
pub struct TestDesc {
pub name: TestName,
pub ignore: bool,
pub should_fail: bool,
}

#[deriving(Show)]
pub struct TestDescAndFn {
pub desc: TestDesc,
pub testfn: TestFn,
Expand Down Expand Up @@ -242,15 +256,9 @@ pub fn test_main(args: &[StrBuf], tests: Vec<TestDescAndFn> ) {
pub fn test_main_static(args: &[StrBuf], tests: &[TestDescAndFn]) {
let owned_tests = tests.iter().map(|t| {
match t.testfn {
StaticTestFn(f) =>
TestDescAndFn { testfn: StaticTestFn(f), desc: t.desc.clone() },

StaticBenchFn(f) =>
TestDescAndFn { testfn: StaticBenchFn(f), desc: t.desc.clone() },

_ => {
fail!("non-static tests passed to test::test_main_static");
}
StaticTestFn(f) => TestDescAndFn { testfn: StaticTestFn(f), desc: t.desc.clone() },
StaticBenchFn(f) => TestDescAndFn { testfn: StaticBenchFn(f), desc: t.desc.clone() },
_ => fail!("non-static tests passed to test::test_main_static")
}
}).collect();
test_main(args, owned_tests)
Expand Down Expand Up @@ -419,8 +427,15 @@ pub fn opt_shard(maybestr: Option<StrBuf>) -> Option<(uint,uint)> {
None => None,
Some(s) => {
let mut it = s.as_slice().split('.');
match (it.next().and_then(from_str), it.next().and_then(from_str), it.next()) {
(Some(a), Some(b), None) => Some((a, b)),
match (it.next().and_then(from_str::<uint>), it.next().and_then(from_str::<uint>),
it.next()) {
(Some(a), Some(b), None) => {
if a <= 0 || a > b {
fail!("tried to run shard {a}.{b}, but {a} is out of bounds \
(should be between 1 and {b}", a=a, b=b)
}
Some((a, b))
}
_ => None,
}
}
Expand Down Expand Up @@ -739,10 +754,9 @@ pub fn fmt_bench_samples(bs: &BenchSamples) -> StrBuf {
}

// A simple console test runner
pub fn run_tests_console(opts: &TestOpts,
tests: Vec<TestDescAndFn> ) -> io::IoResult<bool> {
fn callback<T: Writer>(event: &TestEvent,
st: &mut ConsoleTestState<T>) -> io::IoResult<()> {
pub fn run_tests_console(opts: &TestOpts, tests: Vec<TestDescAndFn> ) -> io::IoResult<bool> {

fn callback<T: Writer>(event: &TestEvent, st: &mut ConsoleTestState<T>) -> io::IoResult<()> {
match (*event).clone() {
TeFiltered(ref filtered_tests) => st.write_run_start(filtered_tests.len()),
TeWait(ref test, padding) => st.write_test_start(test, padding),
Expand Down Expand Up @@ -778,6 +792,7 @@ pub fn run_tests_console(opts: &TestOpts,
}
}
}

let mut st = try!(ConsoleTestState::new(opts, None::<StdWriter>));
fn len_if_padded(t: &TestDescAndFn) -> uint {
match t.testfn.padding() {
Expand Down Expand Up @@ -933,9 +948,7 @@ fn get_concurrency() -> uint {
}
}

pub fn filter_tests(
opts: &TestOpts,
tests: Vec<TestDescAndFn> ) -> Vec<TestDescAndFn> {
pub fn filter_tests(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> Vec<TestDescAndFn> {
let mut filtered = tests;

// Remove tests that don't match the test filter
Expand Down Expand Up @@ -973,7 +986,9 @@ pub fn filter_tests(
None => filtered,
Some((a,b)) => {
filtered.move_iter().enumerate()
.filter(|&(i,_)| i % b == a)
// note: using a - 1 so that the valid shards, for example, are
// 1.2 and 2.2 instead of 0.2 and 1.2
.filter(|&(i,_)| i % b == (a - 1))
.map(|(_,t)| t)
.collect()
}
Expand Down
7 changes: 7 additions & 0 deletions src/test/run-make/test-shard-completeness/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
-include ../tools.mk

all:
# Running all the shards should hit every test
$(RUSTC) --test main.rs
$(call RUN,main) --test-shard 1.2 | grep "test_1 ... ok"
$(call RUN,main) --test-shard 2.2 | grep "test_2 ... ok"
16 changes: 16 additions & 0 deletions src/test/run-make/test-shard-completeness/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Copyright 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
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![crate_type = "lib"]

#[test]
fn test_1() { }
#[test]
fn test_2() { }

0 comments on commit 2eeb499

Please sign in to comment.