Skip to content

Commit 0ff8ddf

Browse files
committed
add tests
1 parent 15cba34 commit 0ff8ddf

File tree

2 files changed

+162
-1
lines changed

2 files changed

+162
-1
lines changed

src/report/analyzer.rs

Lines changed: 160 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ use crate::results::{
77
use std::collections::BTreeSet;
88
use std::collections::HashMap;
99

10-
#[derive(PartialEq)]
1110
pub enum ReportConfig {
1211
Simple,
1312
Complete { toolchain: usize },
1413
}
1514

15+
#[cfg_attr(test, derive(Debug, PartialEq))]
1616
#[derive(Clone)]
1717
pub enum ReportCrates {
1818
Plain(Vec<CrateResult>),
@@ -22,6 +22,7 @@ pub enum ReportCrates {
2222
},
2323
}
2424

25+
#[cfg_attr(test, derive(Debug, PartialEq))]
2526
pub struct TestResults {
2627
pub categories: HashMap<Comparison, ReportCrates>,
2728
pub info: HashMap<Comparison, u32>,
@@ -93,3 +94,161 @@ pub fn analyze_report(test: RawTestResults) -> TestResults {
9394

9495
TestResults { categories, info }
9596
}
97+
98+
#[cfg(test)]
99+
mod tests {
100+
use super::*;
101+
use crate::config::Config;
102+
use crate::crates::{Crate, RegistryCrate};
103+
use crate::experiments::{CapLints, Experiment, Mode, Status};
104+
use crate::report::{generate_report, Comparison};
105+
use crate::results::{DummyDB, FailureReason::*};
106+
use crate::toolchain::{MAIN_TOOLCHAIN, TEST_TOOLCHAIN};
107+
use failure::Fallible;
108+
109+
#[test]
110+
fn test_report_analysis() -> Fallible<()> {
111+
macro_rules! reg {
112+
($name:expr) => {
113+
Crate::Registry(RegistryCrate {
114+
name: $name.into(),
115+
version: "0.0.1".into(),
116+
})
117+
};
118+
}
119+
120+
macro_rules! record_crates {
121+
($db:expr, $ex:expr, $($name:expr => ($tc1:expr, $tc2:expr)),*) => {
122+
{
123+
let mut crates = Vec::new();
124+
$(
125+
let krate = reg!($name);
126+
$db.add_dummy_result(
127+
&$ex,
128+
krate.clone(),
129+
MAIN_TOOLCHAIN.clone(),
130+
$tc1,
131+
);
132+
$db.add_dummy_result(
133+
&$ex,
134+
krate.clone(),
135+
TEST_TOOLCHAIN.clone(),
136+
$tc2,
137+
);
138+
crates.push(krate);
139+
)*
140+
crates
141+
}
142+
};
143+
}
144+
145+
let config = Config::default();
146+
let mut db = DummyDB::default();
147+
let ex = Experiment {
148+
name: "foo".to_string(),
149+
toolchains: [MAIN_TOOLCHAIN.clone(), TEST_TOOLCHAIN.clone()],
150+
mode: Mode::BuildAndTest,
151+
cap_lints: CapLints::Forbid,
152+
priority: 0,
153+
created_at: ::chrono::Utc::now(),
154+
started_at: None,
155+
completed_at: None,
156+
github_issue: None,
157+
status: Status::GeneratingReport,
158+
assigned_to: None,
159+
report_url: None,
160+
ignore_blacklist: false,
161+
requirement: None,
162+
};
163+
164+
let crates = record_crates! {db, ex,
165+
"test-pass" => (TestResult::TestPass, TestResult::TestPass),
166+
"ce-1" => (TestResult::TestPass, TestResult::BuildFail(CompilerError(btreeset!["001".parse()?, "002".parse()?]))),
167+
"ce-2" => (TestResult::TestPass, TestResult::BuildFail(CompilerError(btreeset!["002".parse()?]))),
168+
"unknown" => (TestResult::TestPass, TestResult::BuildFail(Unknown)),
169+
"dep-1" => (TestResult::TestPass, TestResult::BuildFail(DependsOn(btreeset![reg!("ce-1"), reg!("unknown")]))),
170+
"dep-2" => (TestResult::TestPass, TestResult::BuildFail(DependsOn(btreeset![reg!("ce-1"), reg!("ce-2")]))),
171+
"fix-1" => (TestResult::BuildFail(DependsOn(btreeset![reg!("ce-1"), reg!("ce-2")])), TestResult::TestPass),
172+
"fix-2" => (TestResult::BuildFail(Unknown), TestResult::TestPass)
173+
};
174+
175+
let raw = generate_report(&db, &config, &ex, &crates)?;
176+
let mut crates = raw
177+
.crates
178+
.clone()
179+
.into_iter()
180+
.map(|krate| {
181+
if let Crate::Registry(ref registry_krate) = krate.krate {
182+
(registry_krate.name.clone(), krate)
183+
} else {
184+
panic!("invalid crate type")
185+
}
186+
})
187+
.collect::<HashMap<_, _>>();
188+
let analyzed = analyze_report(raw);
189+
190+
let mut info = HashMap::new();
191+
info.insert(Comparison::Regressed, 5);
192+
info.insert(Comparison::Fixed, 2);
193+
info.insert(Comparison::SameTestPass, 1);
194+
195+
macro_rules! create_results {
196+
($src:expr, $($key:expr => ($($krate:expr),*)),*) => {
197+
{
198+
let mut map = HashMap::new();
199+
$(
200+
let mut crates = Vec::new();
201+
$(
202+
crates.push($src.get($krate).unwrap().clone());
203+
)*
204+
map.insert($key, crates);
205+
)*
206+
map
207+
}
208+
}
209+
}
210+
211+
let regr_tree = create_results! {crates,
212+
reg!("ce-1") => ("dep-1", "dep-2"),
213+
reg!("ce-2") => ("dep-2"),
214+
reg!("unknown") => ("dep-1")
215+
};
216+
217+
let regr_root = create_results! {crates,
218+
TestResult::BuildFail(CompilerError(btreeset!["001".parse()?])) => ("ce-1"),
219+
TestResult::BuildFail(CompilerError(btreeset!["002".parse()?])) => ("ce-1", "ce-2"),
220+
TestResult::BuildFail(Unknown) => ("unknown")
221+
};
222+
223+
let regressed = ReportCrates::Complete {
224+
tree: regr_tree,
225+
results: regr_root,
226+
};
227+
228+
let fix_tree = create_results! {crates,
229+
reg!("ce-1") => ("fix-1"),
230+
reg!("ce-2") => ("fix-1")
231+
};
232+
233+
let fix_root = create_results! {crates,
234+
TestResult::BuildFail(Unknown) => ("fix-2")
235+
};
236+
237+
let fixed = ReportCrates::Complete {
238+
tree: fix_tree,
239+
results: fix_root,
240+
};
241+
242+
let test_pass = ReportCrates::Plain(vec![crates.remove("test-pass").unwrap()]);
243+
244+
let mut categories = HashMap::new();
245+
categories.insert(Comparison::Regressed, regressed);
246+
categories.insert(Comparison::Fixed, fixed);
247+
categories.insert(Comparison::SameTestPass, test_pass);
248+
249+
let expected = TestResults { categories, info };
250+
assert_eq!(expected, analyzed);
251+
252+
Ok(())
253+
}
254+
}

src/report/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ pub struct RawTestResults {
4646
pub crates: Vec<CrateResult>,
4747
}
4848

49+
#[cfg_attr(test, derive(Debug, PartialEq))]
4950
#[derive(Serialize, Deserialize, Clone)]
5051
pub struct CrateResult {
5152
name: String,
@@ -106,6 +107,7 @@ impl Comparison {
106107
}
107108
}
108109

110+
#[cfg_attr(test, derive(Debug, PartialEq))]
109111
#[derive(Serialize, Deserialize, Clone)]
110112
struct BuildTestResult {
111113
res: TestResult,

0 commit comments

Comments
 (0)