mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
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:
commit
31c9df79f5
1 changed files with 61 additions and 15 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue