Skip to content
This repository was archived by the owner on Aug 12, 2021. It is now read-only.

Commit 2465b19

Browse files
committed
Import libtest from rust-lang/rust
2 parents 7af6f13 + 29d3509 commit 2465b19

File tree

7 files changed

+3883
-0
lines changed

7 files changed

+3883
-0
lines changed

src/libtest/Cargo.toml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[package]
2+
authors = ["The Rust Project Developers"]
3+
name = "test"
4+
version = "0.0.0"
5+
edition = "2018"
6+
7+
[lib]
8+
name = "test"
9+
path = "lib.rs"
10+
crate-type = ["dylib", "rlib"]
11+
12+
[dependencies]
13+
getopts = "0.2"
14+
term = { path = "../libterm" }
15+
16+
# not actually used but needed to always have proc_macro in the sysroot
17+
proc_macro = { path = "../libproc_macro" }

src/libtest/formatters/json.rs

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
use super::*;
2+
3+
pub(crate) struct JsonFormatter<T> {
4+
out: OutputLocation<T>,
5+
}
6+
7+
impl<T: Write> JsonFormatter<T> {
8+
pub fn new(out: OutputLocation<T>) -> Self {
9+
Self { out }
10+
}
11+
12+
fn write_message(&mut self, s: &str) -> io::Result<()> {
13+
assert!(!s.contains('\n'));
14+
15+
self.out.write_all(s.as_ref())?;
16+
self.out.write_all(b"\n")
17+
}
18+
19+
fn write_event(
20+
&mut self,
21+
ty: &str,
22+
name: &str,
23+
evt: &str,
24+
extra: Option<String>,
25+
) -> io::Result<()> {
26+
if let Some(extras) = extra {
27+
self.write_message(&*format!(
28+
r#"{{ "type": "{}", "name": "{}", "event": "{}", {} }}"#,
29+
ty, name, evt, extras
30+
))
31+
} else {
32+
self.write_message(&*format!(
33+
r#"{{ "type": "{}", "name": "{}", "event": "{}" }}"#,
34+
ty, name, evt
35+
))
36+
}
37+
}
38+
}
39+
40+
impl<T: Write> OutputFormatter for JsonFormatter<T> {
41+
fn write_run_start(&mut self, test_count: usize) -> io::Result<()> {
42+
self.write_message(&*format!(
43+
r#"{{ "type": "suite", "event": "started", "test_count": {} }}"#,
44+
test_count
45+
))
46+
}
47+
48+
fn write_test_start(&mut self, desc: &TestDesc) -> io::Result<()> {
49+
self.write_message(&*format!(
50+
r#"{{ "type": "test", "event": "started", "name": "{}" }}"#,
51+
desc.name
52+
))
53+
}
54+
55+
fn write_result(
56+
&mut self,
57+
desc: &TestDesc,
58+
result: &TestResult,
59+
stdout: &[u8],
60+
) -> io::Result<()> {
61+
match *result {
62+
TrOk => self.write_event("test", desc.name.as_slice(), "ok", None),
63+
64+
TrFailed => {
65+
let extra_data = if stdout.len() > 0 {
66+
Some(format!(
67+
r#""stdout": "{}""#,
68+
EscapedString(String::from_utf8_lossy(stdout))
69+
))
70+
} else {
71+
None
72+
};
73+
74+
self.write_event("test", desc.name.as_slice(), "failed", extra_data)
75+
}
76+
77+
TrFailedMsg(ref m) => self.write_event(
78+
"test",
79+
desc.name.as_slice(),
80+
"failed",
81+
Some(format!(r#""message": "{}""#, EscapedString(m))),
82+
),
83+
84+
TrIgnored => self.write_event("test", desc.name.as_slice(), "ignored", None),
85+
86+
TrAllowedFail => {
87+
self.write_event("test", desc.name.as_slice(), "allowed_failure", None)
88+
}
89+
90+
TrBench(ref bs) => {
91+
let median = bs.ns_iter_summ.median as usize;
92+
let deviation = (bs.ns_iter_summ.max - bs.ns_iter_summ.min) as usize;
93+
94+
let mbps = if bs.mb_s == 0 {
95+
String::new()
96+
} else {
97+
format!(r#", "mib_per_second": {}"#, bs.mb_s)
98+
};
99+
100+
let line = format!(
101+
"{{ \"type\": \"bench\", \
102+
\"name\": \"{}\", \
103+
\"median\": {}, \
104+
\"deviation\": {}{} }}",
105+
desc.name, median, deviation, mbps
106+
);
107+
108+
self.write_message(&*line)
109+
}
110+
}
111+
}
112+
113+
fn write_timeout(&mut self, desc: &TestDesc) -> io::Result<()> {
114+
self.write_message(&*format!(
115+
r#"{{ "type": "test", "event": "timeout", "name": "{}" }}"#,
116+
desc.name
117+
))
118+
}
119+
120+
fn write_run_finish(&mut self, state: &ConsoleTestState) -> io::Result<bool> {
121+
self.write_message(&*format!(
122+
"{{ \"type\": \"suite\", \
123+
\"event\": \"{}\", \
124+
\"passed\": {}, \
125+
\"failed\": {}, \
126+
\"allowed_fail\": {}, \
127+
\"ignored\": {}, \
128+
\"measured\": {}, \
129+
\"filtered_out\": {} }}",
130+
if state.failed == 0 { "ok" } else { "failed" },
131+
state.passed,
132+
state.failed + state.allowed_fail,
133+
state.allowed_fail,
134+
state.ignored,
135+
state.measured,
136+
state.filtered_out
137+
))?;
138+
139+
Ok(state.failed == 0)
140+
}
141+
}
142+
143+
/// A formatting utility used to print strings with characters in need of escaping.
144+
/// Base code taken form `libserialize::json::escape_str`
145+
struct EscapedString<S: AsRef<str>>(S);
146+
147+
impl<S: AsRef<str>> ::std::fmt::Display for EscapedString<S> {
148+
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
149+
let mut start = 0;
150+
151+
for (i, byte) in self.0.as_ref().bytes().enumerate() {
152+
let escaped = match byte {
153+
b'"' => "\\\"",
154+
b'\\' => "\\\\",
155+
b'\x00' => "\\u0000",
156+
b'\x01' => "\\u0001",
157+
b'\x02' => "\\u0002",
158+
b'\x03' => "\\u0003",
159+
b'\x04' => "\\u0004",
160+
b'\x05' => "\\u0005",
161+
b'\x06' => "\\u0006",
162+
b'\x07' => "\\u0007",
163+
b'\x08' => "\\b",
164+
b'\t' => "\\t",
165+
b'\n' => "\\n",
166+
b'\x0b' => "\\u000b",
167+
b'\x0c' => "\\f",
168+
b'\r' => "\\r",
169+
b'\x0e' => "\\u000e",
170+
b'\x0f' => "\\u000f",
171+
b'\x10' => "\\u0010",
172+
b'\x11' => "\\u0011",
173+
b'\x12' => "\\u0012",
174+
b'\x13' => "\\u0013",
175+
b'\x14' => "\\u0014",
176+
b'\x15' => "\\u0015",
177+
b'\x16' => "\\u0016",
178+
b'\x17' => "\\u0017",
179+
b'\x18' => "\\u0018",
180+
b'\x19' => "\\u0019",
181+
b'\x1a' => "\\u001a",
182+
b'\x1b' => "\\u001b",
183+
b'\x1c' => "\\u001c",
184+
b'\x1d' => "\\u001d",
185+
b'\x1e' => "\\u001e",
186+
b'\x1f' => "\\u001f",
187+
b'\x7f' => "\\u007f",
188+
_ => {
189+
continue;
190+
}
191+
};
192+
193+
if start < i {
194+
f.write_str(&self.0.as_ref()[start..i])?;
195+
}
196+
197+
f.write_str(escaped)?;
198+
199+
start = i + 1;
200+
}
201+
202+
if start != self.0.as_ref().len() {
203+
f.write_str(&self.0.as_ref()[start..])?;
204+
}
205+
206+
Ok(())
207+
}
208+
}

src/libtest/formatters/mod.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
use super::*;
2+
3+
mod pretty;
4+
mod json;
5+
mod terse;
6+
7+
pub(crate) use self::pretty::PrettyFormatter;
8+
pub(crate) use self::json::JsonFormatter;
9+
pub(crate) use self::terse::TerseFormatter;
10+
11+
pub(crate) trait OutputFormatter {
12+
fn write_run_start(&mut self, test_count: usize) -> io::Result<()>;
13+
fn write_test_start(&mut self, desc: &TestDesc) -> io::Result<()>;
14+
fn write_timeout(&mut self, desc: &TestDesc) -> io::Result<()>;
15+
fn write_result(
16+
&mut self,
17+
desc: &TestDesc,
18+
result: &TestResult,
19+
stdout: &[u8],
20+
) -> io::Result<()>;
21+
fn write_run_finish(&mut self, state: &ConsoleTestState) -> io::Result<bool>;
22+
}

0 commit comments

Comments
 (0)