Skip to content

Commit e2f5b11

Browse files
authored
fix(schema)!: Track process-start elapsed (#107)
This gives a lot more control for the caller to decide what they track and report.
2 parents bedc35f + 0295927 commit e2f5b11

9 files changed

Lines changed: 333 additions & 82 deletions

File tree

crates/libtest-json/event.schema.json

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,16 @@
55
{
66
"type": "object",
77
"properties": {
8+
"elapsed_s": {
9+
"anyOf": [
10+
{
11+
"$ref": "#/$defs/Elapsed"
12+
},
13+
{
14+
"type": "null"
15+
}
16+
]
17+
},
818
"event": {
919
"type": "string",
1020
"const": "discover_start"
@@ -27,6 +37,16 @@
2737
"description": "Whether selected to be run by the user",
2838
"type": "boolean"
2939
},
40+
"elapsed_s": {
41+
"anyOf": [
42+
{
43+
"$ref": "#/$defs/Elapsed"
44+
},
45+
{
46+
"type": "null"
47+
}
48+
]
49+
},
3050
"event": {
3151
"type": "string",
3252
"const": "discover_case"
@@ -62,6 +82,16 @@
6282
{
6383
"type": "object",
6484
"properties": {
85+
"elapsed_s": {
86+
"anyOf": [
87+
{
88+
"$ref": "#/$defs/Elapsed"
89+
},
90+
{
91+
"type": "null"
92+
}
93+
]
94+
},
6595
"event": {
6696
"type": "string",
6797
"const": "suite_start"
@@ -77,6 +107,16 @@
77107
"name": {
78108
"type": "string"
79109
},
110+
"elapsed_s": {
111+
"anyOf": [
112+
{
113+
"$ref": "#/$defs/Elapsed"
114+
},
115+
{
116+
"type": "null"
117+
}
118+
]
119+
},
80120
"event": {
81121
"type": "string",
82122
"const": "case_start"
@@ -157,16 +197,17 @@
157197
}
158198
],
159199
"$defs": {
200+
"Elapsed": {
201+
"description": "Time elapsed since process start",
202+
"type": "string"
203+
},
160204
"RunMode": {
161205
"type": "string",
162206
"enum": [
163207
"test",
164208
"bench"
165209
]
166210
},
167-
"Elapsed": {
168-
"type": "string"
169-
},
170211
"RunStatus": {
171212
"type": "string",
172213
"enum": [

crates/libtest-json/src/event.rs

Lines changed: 64 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@
44
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
55
#[cfg_attr(feature = "serde", serde(tag = "event"))]
66
pub enum Event {
7-
DiscoverStart,
7+
DiscoverStart {
8+
#[cfg_attr(
9+
feature = "serde",
10+
serde(default, skip_serializing_if = "Option::is_none")
11+
)]
12+
elapsed_s: Option<Elapsed>,
13+
},
814
DiscoverCase {
915
name: String,
1016
#[cfg_attr(
@@ -18,6 +24,11 @@ pub enum Event {
1824
serde(default = "true_default", skip_serializing_if = "is_true")
1925
)]
2026
run: bool,
27+
#[cfg_attr(
28+
feature = "serde",
29+
serde(default, skip_serializing_if = "Option::is_none")
30+
)]
31+
elapsed_s: Option<Elapsed>,
2132
},
2233
DiscoverComplete {
2334
#[cfg_attr(
@@ -26,9 +37,20 @@ pub enum Event {
2637
)]
2738
elapsed_s: Option<Elapsed>,
2839
},
29-
SuiteStart,
40+
SuiteStart {
41+
#[cfg_attr(
42+
feature = "serde",
43+
serde(default, skip_serializing_if = "Option::is_none")
44+
)]
45+
elapsed_s: Option<Elapsed>,
46+
},
3047
CaseStart {
3148
name: String,
49+
#[cfg_attr(
50+
feature = "serde",
51+
serde(default, skip_serializing_if = "Option::is_none")
52+
)]
53+
elapsed_s: Option<Elapsed>,
3254
},
3355
CaseComplete {
3456
name: String,
@@ -71,12 +93,24 @@ impl Event {
7193
let mut buffer = String::new();
7294
buffer.open_object().unwrap();
7395
match self {
74-
Self::DiscoverStart => {
96+
Self::DiscoverStart { elapsed_s } => {
7597
buffer.key("event").unwrap();
7698
buffer.keyval_sep().unwrap();
7799
buffer.value("discover_start").unwrap();
100+
101+
if let Some(elapsed_s) = elapsed_s {
102+
buffer.val_sep().unwrap();
103+
buffer.key("elapsed_s").unwrap();
104+
buffer.keyval_sep().unwrap();
105+
buffer.value(String::from(*elapsed_s)).unwrap();
106+
}
78107
}
79-
Self::DiscoverCase { name, mode, run } => {
108+
Self::DiscoverCase {
109+
name,
110+
mode,
111+
run,
112+
elapsed_s,
113+
} => {
80114
buffer.key("event").unwrap();
81115
buffer.keyval_sep().unwrap();
82116
buffer.value("discover_case").unwrap();
@@ -99,24 +133,39 @@ impl Event {
99133
buffer.keyval_sep().unwrap();
100134
buffer.value(run).unwrap();
101135
}
136+
137+
if let Some(elapsed_s) = elapsed_s {
138+
buffer.val_sep().unwrap();
139+
buffer.key("elapsed_s").unwrap();
140+
buffer.keyval_sep().unwrap();
141+
buffer.value(String::from(*elapsed_s)).unwrap();
142+
}
102143
}
103144
Self::DiscoverComplete { elapsed_s } => {
104145
buffer.key("event").unwrap();
105146
buffer.keyval_sep().unwrap();
106147
buffer.value("discover_complete").unwrap();
148+
107149
if let Some(elapsed_s) = elapsed_s {
108150
buffer.val_sep().unwrap();
109151
buffer.key("elapsed_s").unwrap();
110152
buffer.keyval_sep().unwrap();
111153
buffer.value(String::from(*elapsed_s)).unwrap();
112154
}
113155
}
114-
Self::SuiteStart => {
156+
Self::SuiteStart { elapsed_s } => {
115157
buffer.key("event").unwrap();
116158
buffer.keyval_sep().unwrap();
117159
buffer.value("suite_start").unwrap();
160+
161+
if let Some(elapsed_s) = elapsed_s {
162+
buffer.val_sep().unwrap();
163+
buffer.key("elapsed_s").unwrap();
164+
buffer.keyval_sep().unwrap();
165+
buffer.value(String::from(*elapsed_s)).unwrap();
166+
}
118167
}
119-
Self::CaseStart { name } => {
168+
Self::CaseStart { name, elapsed_s } => {
120169
buffer.key("event").unwrap();
121170
buffer.keyval_sep().unwrap();
122171
buffer.value("case_start").unwrap();
@@ -125,6 +174,13 @@ impl Event {
125174
buffer.key("name").unwrap();
126175
buffer.keyval_sep().unwrap();
127176
buffer.value(name).unwrap();
177+
178+
if let Some(elapsed_s) = elapsed_s {
179+
buffer.val_sep().unwrap();
180+
buffer.key("elapsed_s").unwrap();
181+
buffer.keyval_sep().unwrap();
182+
buffer.value(String::from(*elapsed_s)).unwrap();
183+
}
128184
}
129185
Self::CaseComplete {
130186
name,
@@ -174,6 +230,7 @@ impl Event {
174230
buffer.key("event").unwrap();
175231
buffer.keyval_sep().unwrap();
176232
buffer.value("suite_complete").unwrap();
233+
177234
if let Some(elapsed_s) = elapsed_s {
178235
buffer.val_sep().unwrap();
179236
buffer.key("elapsed_s").unwrap();
@@ -237,6 +294,7 @@ impl RunStatus {
237294
}
238295
}
239296

297+
/// Time elapsed since process start
240298
#[derive(Copy, Clone, Default, Debug, PartialEq, Eq)]
241299
#[cfg_attr(feature = "unstable-schema", derive(schemars::JsonSchema))]
242300
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]

crates/libtest-json/tests/roundtrip.rs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,15 @@ fn t(input: libtest_json::Event, snapshot: impl IntoData) {
1717
#[test]
1818
fn discover_start() {
1919
t(
20-
libtest_json::Event::DiscoverStart,
20+
libtest_json::Event::DiscoverStart { elapsed_s: None },
2121
str![[r#"{"event":"discover_start"}"#]],
2222
);
23+
t(
24+
libtest_json::Event::DiscoverStart {
25+
elapsed_s: Some(libtest_json::Elapsed(Default::default())),
26+
},
27+
str![[r#"{"event":"discover_start","elapsed_s":"0"}"#]],
28+
);
2329
}
2430

2531
#[test]
@@ -29,6 +35,7 @@ fn discover_case() {
2935
name: "Hello\tworld!".to_owned(),
3036
mode: libtest_json::RunMode::Test,
3137
run: true,
38+
elapsed_s: None,
3239
},
3340
str![[r#"{"event":"discover_case","name":"Hello\tworld!"}"#]],
3441
);
@@ -38,8 +45,11 @@ fn discover_case() {
3845
name: "Hello\tworld!".to_owned(),
3946
mode: libtest_json::RunMode::Bench,
4047
run: false,
48+
elapsed_s: Some(libtest_json::Elapsed(Default::default())),
4149
},
42-
str![[r#"{"event":"discover_case","name":"Hello\tworld!","mode":"bench","run":false}"#]],
50+
str![[
51+
r#"{"event":"discover_case","name":"Hello\tworld!","mode":"bench","run":false,"elapsed_s":"0"}"#
52+
]],
4353
);
4454
}
4555

@@ -61,19 +71,33 @@ fn discover_complete() {
6171
#[test]
6272
fn suite_start() {
6373
t(
64-
libtest_json::Event::SuiteStart,
74+
libtest_json::Event::SuiteStart { elapsed_s: None },
6575
str![[r#"{"event":"suite_start"}"#]],
6676
);
77+
t(
78+
libtest_json::Event::SuiteStart {
79+
elapsed_s: Some(libtest_json::Elapsed(Default::default())),
80+
},
81+
str![[r#"{"event":"suite_start","elapsed_s":"0"}"#]],
82+
);
6783
}
6884

6985
#[test]
7086
fn case_start() {
7187
t(
7288
libtest_json::Event::CaseStart {
7389
name: "Hello\tworld!".to_owned(),
90+
elapsed_s: None,
7491
},
7592
str![[r#"{"event":"case_start","name":"Hello\tworld!"}"#]],
7693
);
94+
t(
95+
libtest_json::Event::CaseStart {
96+
name: "Hello\tworld!".to_owned(),
97+
elapsed_s: Some(libtest_json::Elapsed(Default::default())),
98+
},
99+
str![[r#"{"event":"case_start","name":"Hello\tworld!","elapsed_s":"0"}"#]],
100+
);
77101
}
78102

79103
#[test]

0 commit comments

Comments
 (0)