Skip to content

Commit d52ce05

Browse files
committed
results: add failure reason to build/test failures
1 parent 0cf4634 commit d52ce05

File tree

17 files changed

+357
-130
lines changed

17 files changed

+357
-130
lines changed

Cargo.lock

Lines changed: 34 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ lazy_static = "1.0"
2727
mime = "0.3.1"
2828
minifier = { version = "0.0.20", features = ["html"] }
2929
nix = "0.11.0"
30+
paste = "0.1.3"
3031
petgraph = "0.4.11"
3132
r2d2 = "0.8.2"
3233
r2d2_sqlite = "0.7.0"

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ extern crate mime;
2121
extern crate minifier;
2222
#[cfg(unix)]
2323
extern crate nix;
24+
#[macro_use]
25+
extern crate paste;
2426
extern crate petgraph;
2527
extern crate r2d2;
2628
extern crate r2d2_sqlite;

src/prelude.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,22 @@
1+
use failure::Context;
12
pub use failure::{err_msg, Fail, Fallible, ResultExt};
23

4+
pub trait FailExt {
5+
fn downcast_ctx<T: Fail>(&self) -> Option<&T>;
6+
}
7+
8+
impl FailExt for dyn Fail {
9+
fn downcast_ctx<T: Fail>(&self) -> Option<&T> {
10+
if let Some(res) = self.downcast_ref::<T>() {
11+
Some(res)
12+
} else if let Some(ctx) = self.downcast_ref::<Context<T>>() {
13+
Some(ctx.get_context())
14+
} else {
15+
None
16+
}
17+
}
18+
}
19+
320
macro_rules! to_failure_compat {
421
($($error:path,)*) => {
522
pub trait ToFailureCompat<T> {

src/report/archives.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ mod tests {
100100
use flate2::read::GzDecoder;
101101
use mime::Mime;
102102
use report::DummyWriter;
103-
use results::{DatabaseDB, TestResult, WriteResults};
103+
use results::{DatabaseDB, FailureReason, TestResult, WriteResults};
104104
use std::io::Read;
105105
use tar::Archive;
106106

@@ -130,7 +130,7 @@ mod tests {
130130
results
131131
.record_result(&ex, &ex.toolchains[1], &crate1, || {
132132
info!("tc2 crate1");
133-
Ok(TestResult::BuildFail)
133+
Ok(TestResult::BuildFail(FailureReason::Unknown))
134134
}).unwrap();
135135
results
136136
.record_result(&ex, &ex.toolchains[0], &crate2, || {

src/report/html.rs

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use mime;
44
use minifier;
55
use prelude::*;
66
use report::{archives::Archive, Comparison, CrateResult, ReportWriter, TestResults};
7-
use results::TestResult;
7+
use results::{FailureReason, TestResult};
88
use std::collections::HashMap;
99

1010
#[derive(Serialize)]
@@ -36,14 +36,41 @@ impl ResultColor for Comparison {
3636
impl ResultColor for TestResult {
3737
fn color(&self) -> Color {
3838
match self {
39-
TestResult::BuildFail => Color::Single("#db3026"),
40-
TestResult::TestFail => Color::Single("#65461e"),
39+
TestResult::BuildFail(_) => Color::Single("#db3026"),
40+
TestResult::TestFail(_) => Color::Single("#65461e"),
4141
TestResult::TestSkipped | TestResult::TestPass => Color::Single("#62a156"),
4242
TestResult::Error => Color::Single("#d77026"),
4343
}
4444
}
4545
}
4646

47+
trait ResultName {
48+
fn name(&self) -> String;
49+
}
50+
51+
impl ResultName for FailureReason {
52+
fn name(&self) -> String {
53+
match self {
54+
FailureReason::Unknown => "failed".into(),
55+
FailureReason::Broken => "broken".into(),
56+
FailureReason::Timeout => "timed out".into(),
57+
FailureReason::OOM => "OOM".into(),
58+
}
59+
}
60+
}
61+
62+
impl ResultName for TestResult {
63+
fn name(&self) -> String {
64+
match self {
65+
TestResult::BuildFail(reason) => format!("build {}", reason.name()),
66+
TestResult::TestFail(reason) => format!("test {}", reason.name()),
67+
TestResult::TestSkipped => "test skipped".into(),
68+
TestResult::TestPass => "test passed".into(),
69+
TestResult::Error => "error".into(),
70+
}
71+
}
72+
}
73+
4774
#[derive(Serialize)]
4875
struct NavbarItem {
4976
label: &'static str,
@@ -90,6 +117,7 @@ struct ResultsContext<'a> {
90117

91118
comparison_colors: HashMap<Comparison, Color>,
92119
result_colors: HashMap<TestResult, Color>,
120+
result_names: HashMap<TestResult, String>,
93121
}
94122

95123
#[derive(Serialize)]
@@ -110,6 +138,7 @@ fn write_report<W: ReportWriter>(
110138
) -> Fallible<()> {
111139
let mut comparison_colors = HashMap::new();
112140
let mut result_colors = HashMap::new();
141+
let mut result_names = HashMap::new();
113142

114143
let mut categories = HashMap::new();
115144
for result in &res.crates {
@@ -118,19 +147,25 @@ fn write_report<W: ReportWriter>(
118147
continue;
119148
}
120149

121-
// Add the colors used in this run
150+
// Add the colors and names used in this run
122151
comparison_colors
123152
.entry(result.res)
124153
.or_insert_with(|| result.res.color());
125154
if let Some(ref run) = result.runs[0] {
126155
result_colors
127156
.entry(run.res)
128157
.or_insert_with(|| run.res.color());
158+
result_names
159+
.entry(run.res)
160+
.or_insert_with(|| run.res.name());
129161
}
130162
if let Some(ref run) = result.runs[1] {
131163
result_colors
132164
.entry(run.res)
133165
.or_insert_with(|| run.res.color());
166+
result_names
167+
.entry(run.res)
168+
.or_insert_with(|| run.res.name());
134169
}
135170

136171
let mut category = categories.entry(result.res).or_insert_with(Vec::new);
@@ -150,6 +185,7 @@ fn write_report<W: ReportWriter>(
150185

151186
comparison_colors,
152187
result_colors,
188+
result_names,
153189
};
154190

155191
info!("generating {}", to);

src/report/mod.rs

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -296,22 +296,22 @@ fn compare(
296296
use results::TestResult::*;
297297
match (r1, r2) {
298298
(Some(res1), Some(res2)) => match (res1, res2) {
299-
(BuildFail, BuildFail) => Comparison::SameBuildFail,
300-
(TestFail, TestFail) => Comparison::SameTestFail,
299+
(BuildFail(_), BuildFail(_)) => Comparison::SameBuildFail,
300+
(TestFail(_), TestFail(_)) => Comparison::SameTestFail,
301301
(TestSkipped, TestSkipped) => Comparison::SameTestSkipped,
302302
(TestPass, TestPass) => Comparison::SameTestPass,
303-
(BuildFail, TestFail)
304-
| (BuildFail, TestSkipped)
305-
| (BuildFail, TestPass)
306-
| (TestFail, TestPass) => Comparison::Fixed,
307-
(TestPass, TestFail)
308-
| (TestPass, BuildFail)
309-
| (TestSkipped, BuildFail)
310-
| (TestFail, BuildFail) => Comparison::Regressed,
303+
(BuildFail(_), TestFail(_))
304+
| (BuildFail(_), TestSkipped)
305+
| (BuildFail(_), TestPass)
306+
| (TestFail(_), TestPass) => Comparison::Fixed,
307+
(TestPass, TestFail(_))
308+
| (TestPass, BuildFail(_))
309+
| (TestSkipped, BuildFail(_))
310+
| (TestFail(_), BuildFail(_)) => Comparison::Regressed,
311311
(Error, _) | (_, Error) => Comparison::Error,
312-
(TestFail, TestSkipped)
312+
(TestFail(_), TestSkipped)
313313
| (TestPass, TestSkipped)
314-
| (TestSkipped, TestFail)
314+
| (TestSkipped, TestFail(_))
315315
| (TestSkipped, TestPass) => {
316316
panic!("can't compare {} and {}", res1, res2);
317317
}
@@ -426,7 +426,7 @@ mod tests {
426426
use config::{Config, CrateConfig};
427427
use crates::{Crate, GitHubRepo, RegistryCrate};
428428
use experiments::{CapLints, Experiment, Mode, Status};
429-
use results::{DummyDB, TestResult};
429+
use results::{DummyDB, FailureReason, TestResult};
430430
use std::collections::HashMap;
431431
use toolchain::{MAIN_TOOLCHAIN, TEST_TOOLCHAIN};
432432

@@ -515,15 +515,17 @@ mod tests {
515515

516516
#[test]
517517
fn test_compare() {
518+
use results::{FailureReason::*, TestResult::*};
519+
518520
macro_rules! test_compare {
519-
($cmp:ident, $config:expr, $reg:expr, [$($a:ident + $b:ident = $c:ident,)*]) => {
521+
($cmp:ident, $config:expr, $reg:expr, [$($a:expr, $b:expr => $c:ident;)*]) => {
520522
$(
521523
assert_eq!(
522524
$cmp(
523525
$config,
524526
$reg,
525-
Some(TestResult::$a),
526-
Some(TestResult::$b),
527+
Some($a),
528+
Some($b),
527529
),
528530
Comparison::$c
529531
);
@@ -542,26 +544,26 @@ mod tests {
542544
&config,
543545
&reg,
544546
[
545-
BuildFail + BuildFail = SameBuildFail,
546-
TestFail + TestFail = SameTestFail,
547-
TestSkipped + TestSkipped = SameTestSkipped,
548-
TestPass + TestPass = SameTestPass,
549-
BuildFail + TestFail = Fixed,
550-
BuildFail + TestSkipped = Fixed,
551-
BuildFail + TestPass = Fixed,
552-
TestFail + TestPass = Fixed,
553-
TestPass + TestFail = Regressed,
554-
TestPass + BuildFail = Regressed,
555-
TestSkipped + BuildFail = Regressed,
556-
TestFail + BuildFail = Regressed,
557-
Error + TestPass = Error,
558-
Error + TestSkipped = Error,
559-
Error + TestFail = Error,
560-
Error + BuildFail = Error,
561-
TestPass + Error = Error,
562-
TestSkipped + Error = Error,
563-
TestFail + Error = Error,
564-
BuildFail + Error = Error,
547+
BuildFail(Unknown), BuildFail(Unknown) => SameBuildFail;
548+
TestFail(Unknown), TestFail(Unknown) => SameTestFail;
549+
TestSkipped, TestSkipped => SameTestSkipped;
550+
TestPass, TestPass => SameTestPass;
551+
BuildFail(Unknown), TestFail(Unknown) => Fixed;
552+
BuildFail(Unknown), TestSkipped => Fixed;
553+
BuildFail(Unknown), TestPass => Fixed;
554+
TestFail(Unknown), TestPass => Fixed;
555+
TestPass, TestFail(Unknown) => Regressed;
556+
TestPass, BuildFail(Unknown) => Regressed;
557+
TestSkipped, BuildFail(Unknown) => Regressed;
558+
TestFail(Unknown), BuildFail(Unknown) => Regressed;
559+
Error, TestPass => Error;
560+
Error, TestSkipped => Error;
561+
Error, TestFail(Unknown) => Error;
562+
Error, BuildFail(Unknown) => Error;
563+
TestPass, Error => Error;
564+
TestSkipped, Error => Error;
565+
TestFail(Unknown), Error => Error;
566+
BuildFail(Unknown), Error => Error;
565567
]
566568
);
567569

@@ -618,7 +620,7 @@ mod tests {
618620
&ex,
619621
gh.clone(),
620622
TEST_TOOLCHAIN.clone(),
621-
TestResult::BuildFail,
623+
TestResult::BuildFail(FailureReason::Unknown),
622624
);
623625
db.add_dummy_log(
624626
&ex,
@@ -668,7 +670,7 @@ mod tests {
668670
);
669671
assert_eq!(
670672
(&crate_result.runs[1]).as_ref().unwrap().res,
671-
TestResult::BuildFail
673+
TestResult::BuildFail(FailureReason::Unknown)
672674
);
673675
assert_eq!(
674676
(&crate_result.runs[0]).as_ref().unwrap().log.as_str(),

src/results/db.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ impl<'a> DatabaseDB<'a> {
6666
&ex.name,
6767
&serde_json::to_string(krate)?,
6868
&toolchain.to_string(),
69-
&res.to_str(),
69+
&res.to_string(),
7070
&log,
7171
],
7272
)?;
@@ -211,7 +211,7 @@ mod tests {
211211
use crates::{Crate, GitHubRepo, RegistryCrate};
212212
use db::Database;
213213
use experiments::Experiment;
214-
use results::{DeleteResults, ReadResults, TestResult, WriteResults};
214+
use results::{DeleteResults, FailureReason, ReadResults, TestResult, WriteResults};
215215
use toolchain::{MAIN_TOOLCHAIN, TEST_TOOLCHAIN};
216216

217217
#[test]
@@ -345,11 +345,11 @@ mod tests {
345345
results
346346
.record_result(&ex, &TEST_TOOLCHAIN, &krate, || {
347347
info!("Another log message!");
348-
Ok(TestResult::TestFail)
348+
Ok(TestResult::TestFail(FailureReason::Unknown))
349349
}).unwrap();
350350
assert_eq!(
351351
results.get_result(&ex, &TEST_TOOLCHAIN, &krate).unwrap(),
352-
Some(TestResult::TestFail)
352+
Some(TestResult::TestFail(FailureReason::Unknown))
353353
);
354354

355355
// Test deleting the newly-added result

0 commit comments

Comments
 (0)