nextest_runner/config/elements/
junit.rs1use camino::{Utf8Path, Utf8PathBuf};
5use serde::{Deserialize, Serialize};
6
7#[derive(Clone, Copy, Debug, Default, Deserialize, Serialize, PartialEq, Eq)]
13#[cfg_attr(feature = "config-schema", derive(schemars::JsonSchema))]
14#[serde(rename_all = "kebab-case")]
15#[cfg_attr(test, derive(test_strategy::Arbitrary))]
16pub enum JunitFlakyFailStatus {
17 #[default]
20 Failure,
21
22 Success,
24}
25
26#[derive(Clone, Debug)]
30pub struct JunitConfig<'cfg> {
31 path: Utf8PathBuf,
32 report_name: &'cfg str,
33 store_success_output: bool,
34 store_failure_output: bool,
35 flaky_fail_status: JunitFlakyFailStatus,
36}
37
38impl<'cfg> JunitConfig<'cfg> {
39 pub(in crate::config) fn new(
40 store_dir: &Utf8Path,
41 settings: JunitSettings<'cfg>,
42 ) -> Option<Self> {
43 let path = settings.path?;
44 Some(Self {
45 path: store_dir.join(path),
46 report_name: settings.report_name,
47 store_success_output: settings.store_success_output,
48 store_failure_output: settings.store_failure_output,
49 flaky_fail_status: settings.flaky_fail_status,
50 })
51 }
52
53 pub fn path(&self) -> &Utf8Path {
55 &self.path
56 }
57
58 pub fn report_name(&self) -> &'cfg str {
60 self.report_name
61 }
62
63 pub fn store_success_output(&self) -> bool {
65 self.store_success_output
66 }
67
68 pub fn store_failure_output(&self) -> bool {
70 self.store_failure_output
71 }
72
73 pub fn flaky_fail_status(&self) -> JunitFlakyFailStatus {
75 self.flaky_fail_status
76 }
77}
78
79#[derive(Clone, Debug)]
81pub(in crate::config) struct JunitSettings<'cfg> {
82 pub(in crate::config) path: Option<&'cfg Utf8Path>,
83 pub(in crate::config) report_name: &'cfg str,
84 pub(in crate::config) store_success_output: bool,
85 pub(in crate::config) store_failure_output: bool,
86 pub(in crate::config) flaky_fail_status: JunitFlakyFailStatus,
87}
88
89#[derive(Clone, Debug)]
90pub(in crate::config) struct DefaultJunitImpl {
91 pub(in crate::config) path: Option<Utf8PathBuf>,
92 pub(in crate::config) report_name: String,
93 pub(in crate::config) store_success_output: bool,
94 pub(in crate::config) store_failure_output: bool,
95 pub(in crate::config) flaky_fail_status: JunitFlakyFailStatus,
96}
97
98impl DefaultJunitImpl {
99 pub(crate) fn for_default_profile(data: JunitImpl) -> Self {
101 DefaultJunitImpl {
102 path: data.path,
103 report_name: data
104 .report_name
105 .expect("junit.report present in default profile"),
106 store_success_output: data
107 .store_success_output
108 .expect("junit.store-success-output present in default profile"),
109 store_failure_output: data
110 .store_failure_output
111 .expect("junit.store-failure-output present in default profile"),
112 flaky_fail_status: data
113 .flaky_fail_status
114 .expect("junit.flaky-fail-status present in default profile"),
115 }
116 }
117}
118
119#[derive(Clone, Debug, Default, Deserialize)]
120#[cfg_attr(feature = "config-schema", derive(schemars::JsonSchema))]
121#[cfg_attr(feature = "config-schema", schemars(deny_unknown_fields))]
122#[serde(rename_all = "kebab-case")]
123pub(in crate::config) struct JunitImpl {
124 #[serde(default)]
127 #[cfg_attr(
128 feature = "config-schema",
129 schemars(schema_with = "String::json_schema")
130 )]
131 pub(in crate::config) path: Option<Utf8PathBuf>,
132 #[serde(default)]
134 pub(in crate::config) report_name: Option<String>,
135 #[serde(default)]
137 pub(in crate::config) store_success_output: Option<bool>,
138 #[serde(default)]
140 pub(in crate::config) store_failure_output: Option<bool>,
141 #[serde(default)]
143 pub(in crate::config) flaky_fail_status: Option<JunitFlakyFailStatus>,
144}