Merge pull request #2940 from glennw/reftest-conditions

Add support for marking a ref test as flaky on cpu and/or gpu.
This commit is contained in:
Manish Goregaokar 2014-08-01 12:12:10 +05:30
commit 31c9df79f5

View file

@ -21,8 +21,8 @@ use test::run_tests_console;
use regex::Regex; use regex::Regex;
enum RenderMode { enum RenderMode {
CpuRendering, CpuRendering = 1,
GpuRendering, GpuRendering = 2,
} }
fn main() { fn main() {
@ -79,6 +79,14 @@ struct Reftest {
id: uint, id: uint,
servo_args: Vec<String>, servo_args: Vec<String>,
render_mode: RenderMode, render_mode: RenderMode,
flakiness: uint,
}
struct TestLine<'a> {
conditions: &'a str,
kind: &'a str,
file_left: &'a str,
file_right: &'a str,
} }
fn parse_lists(file: &String, servo_args: &[String], render_mode: RenderMode) -> Vec<TestDescAndFn> { fn parse_lists(file: &String, servo_args: &[String], render_mode: RenderMode) -> Vec<TestDescAndFn> {
@ -101,28 +109,60 @@ fn parse_lists(file: &String, servo_args: &[String], render_mode: RenderMode) ->
let parts: Vec<&str> = line.split(' ').filter(|p| !p.is_empty()).collect(); let parts: Vec<&str> = line.split(' ').filter(|p| !p.is_empty()).collect();
if parts.len() != 3 { let test_line = match parts.len() {
fail!("reftest line: '{:s}' doesn't match 'KIND LEFT RIGHT'", line); 3 => {
} TestLine {
conditions: "",
kind: *parts.get(0),
file_left: *parts.get(1),
file_right: *parts.get(2),
}
},
4 => {
TestLine {
conditions: *parts.get(0),
kind: *parts.get(1),
file_left: *parts.get(2),
file_right: *parts.get(3),
}
},
_ => {
fail!("reftest line: '{:s}' doesn't match '[CONDITIONS] KIND LEFT RIGHT'", line);
}
};
let kind = match parts.get(0) { let kind = match test_line.kind {
& "==" => Same, "==" => Same,
& "!=" => Different, "!=" => Different,
&part => fail!("reftest line: '{:s}' has invalid kind '{:s}'", part => fail!("reftest line: '{:s}' has invalid kind '{:s}'", line, part)
line, part)
}; };
let src_path = file_path.dir_path(); let src_path = file_path.dir_path();
let src_dir = src_path.display().to_str(); let src_dir = src_path.display().to_str();
let file_left = src_dir.clone().append("/").append(*parts.get(1)); let file_left = src_dir.clone().append("/").append(test_line.file_left);
let file_right = src_dir.append("/").append(*parts.get(2)); let file_right = src_dir.append("/").append(test_line.file_right);
let mut conditions_list = test_line.conditions.split(',');
let mut flakiness = 0;
for condition in conditions_list {
match condition {
"flaky_cpu" => {
flakiness |= CpuRendering as uint;
},
"flaky_gpu" => {
flakiness |= GpuRendering as uint;
},
_ => {}
}
}
let reftest = Reftest { let reftest = Reftest {
name: parts.get(1).to_string().append(" / ").append(*parts.get(2)), name: test_line.file_left.to_string().append(" / ").append(test_line.file_right),
kind: kind, kind: kind,
files: [file_left, file_right], files: [file_left, file_right],
id: next_id, id: next_id,
render_mode: render_mode, render_mode: render_mode,
servo_args: servo_args.iter().map(|x| x.clone()).collect(), servo_args: servo_args.iter().map(|x| x.clone()).collect(),
flakiness: flakiness,
}; };
next_id += 1; next_id += 1;
@ -181,6 +221,8 @@ fn check_reftest(reftest: Reftest) {
} }
}).collect(); }).collect();
let test_is_flaky = (reftest.render_mode as uint & reftest.flakiness) != 0;
if pixels.iter().any(|&a| a < 255) { if pixels.iter().any(|&a| a < 255) {
let output_str = format!("/tmp/servo-reftest-{:06u}-diff.png", reftest.id); let output_str = format!("/tmp/servo-reftest-{:06u}-diff.png", reftest.id);
let output = from_str::<Path>(output_str.as_slice()).unwrap(); let output = from_str::<Path>(output_str.as_slice()).unwrap();
@ -194,8 +236,12 @@ fn check_reftest(reftest: Reftest) {
let res = png::store_png(&img, &output); let res = png::store_png(&img, &output);
assert!(res.is_ok()); assert!(res.is_ok());
assert!(reftest.kind == Different, "rendering difference: {}", output_str); match (reftest.kind, test_is_flaky) {
(Same, true) => println!("flaky test - rendering difference: {}", output_str),
(Same, false) => fail!("rendering difference: {}", output_str),
(Different, _) => {} // Result was different and that's what was expected
}
} else { } else {
assert!(reftest.kind == Same); assert!(test_is_flaky || reftest.kind == Same);
} }
} }